Ответ
Да. Ключевое слово 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.