К чему, кроме переменных, можно применить ключевое слово final в Java?

«К чему, кроме переменных, можно применить ключевое слово final в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Помимо переменных (полей класса и локальных), в Java ключевое слово final применяется к классам и методам.

1. Final класс

Запрещает создание подклассов. Это используется для обеспечения неизменяемости (immutability) или безопасности (например, класс String, Integer).

final class SecurityCriticalClass {
    // Код класса
}
// Попытка наследования вызовет ошибку компиляции:
// class SubClass extends SecurityCriticalClass { } // ОШИБКА: Cannot inherit from final class

2. Final метод

Запрещает переопределение (override) метода в дочерних классах. Это гарантирует, что поведение метода останется неизменным в иерархии наследования.

class Parent {
    // Этот метод нельзя переопределить
    public final void criticalAlgorithm() {
        System.out.println("Оригинальная, неизменная логика");
    }
}
class Child extends Parent {
    // @Override
    // public void criticalAlgorithm() { } // ОШИБКА КОМПИЛЯЦИИ
}

Почему это важно?

  • Безопасность и проектирование: final классы и методы явно определяют контракт, который нельзя нарушить через наследование, что предотвращает непреднамеренное изменение критического поведения.
  • Оптимизация: Компилятор и JVM могут применять агрессивные оптимизации (например, встраивание вызова — inlining) к final методам, так как их реализация гарантированно известна.