Может ли класс быть объявлен как final в Java?

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

Ответ

Да, класс может быть объявлен как final. Это ключевое слово запрещает наследование от этого класса, обеспечивая безопасность и неизменяемость его поведения.

Зачем это нужно:

  • Защита от наследования: Гарантирует, что логика класса (например, иммутабельного класса-значения) не будет изменена в подклассах.
  • Безопасность: Предотвращает переопределение методов, что критично для классов, отвечающих за безопасность (например, String).
  • Оптимизация: Компилятор может применять дополнительные оптимизации, зная, что у класса нет наследников.

Пример:

final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
    // Геттеры...
}

// Ошибка компиляции: Cannot inherit from final 'ImmutablePoint'
// class ExtendedPoint extends ImmutablePoint {}

Все основные классы-обёртки (String, Integer, Double) в Java объявлены как final.