Что делает модификатор final при объявлении класса и можно ли его применить к интерфейсу?

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

Ответ

Модификатор final имеет разное значение для классов и интерфейсов.

1. final класс: Класс, объявленный как final, не может быть унаследован (от него нельзя создать подкласс).

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

  • Обеспечение неизменяемости (Immutable classes): Например, класс String объявлен как final, чтобы предотвратить изменение его поведения через наследование.
  • Безопасность: Предотвращает создание подклассов, которые могут нарушить инварианты (условия корректности) родительского класса.
  • Проектирование API: Явно указывает, что класс не предназначен для расширения.

Пример:

final class UtilityClass {
    private UtilityClass() {} // Приватный конструктор
    public static void helperMethod() { /* ... */ }
}
// Ошибка компиляции: Cannot inherit from final 'UtilityClass'
// class SubClass extends UtilityClass {}

2. final интерфейс: Применение final к интерфейсу запрещено спецификацией Java и вызовет ошибку компиляции. Интерфейс по своей сути предназначен для реализации, и ключевое слово final противоречит этой цели.

// Ошибка компиляции: Illegal modifier for the interface
// final interface MyInterface {}