Запрещает ли модификатор final наследование от класса в Java?

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

Ответ

Да. Ключевое слово final в объявлении класса строго запрещает любое наследование от него. Попытка создать подкласс вызовет ошибку компиляции.

Пример:

final class BaseClass {
    public void show() {
        System.out.println("Method from final class");
    }
}

// Эта строка вызовет ошибку компиляции:
// error: cannot inherit from final BaseClass
class DerivedClass extends BaseClass { 
}

Применение: Классы помечают как final по нескольким причинам:

  • Обеспечение неизменяемости (immutability): Часть контракта неизменяемого класса.
  • Безопасность и проектирование: Чтобы гарантировать, что поведение класса не будет изменено через наследование (например, в классах-утилитах String, Integer или Math).
  • Оптимизация: Компилятор и JVM могут применять дополнительные оптимизации к final-классам.

Важно: final не защищает от других способов модификации поведения, таких как композиция или (с ограничениями) рефлексия. Для полного контроля над созданием экземпляров (например, в паттерне Singleton) конструкторы также могут быть объявлены как private.