Каково назначение модификатора final для классов, методов и переменных в Java?

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

Ответ

Модификатор final накладывает ограничения на изменение сущности и используется для создания констант, защиты от наследования и обеспечения неизменяемости.

1. Final класс: Запрещает наследование. Часто применяется для создания immutable-классов (например, String) или классов с критичной для безопасности логикой.

    final class SecurityManager { ... }
    // class SubManager extends SecurityManager { } // Ошибка компиляции

2. Final метод: Запрещает переопределение (override) в подклассах. Используется, когда реализация метода должна оставаться неизменной в иерархии наследования.

    class Base {
        public final void criticalAlgorithm() { ... }
    }

3. Final переменная (включая поля и локальные переменные): После присвоения значения ссылку нельзя изменить.

  • Для примитивов: Значение становится константой.
        final int MAX_USERS = 100;
        // MAX_USERS = 200; // Ошибка компиляции
  • Для ссылок на объекты: Нельзя изменить саму ссылку, но состояние объекта (его поля) изменить можно, если они не final.
        final List<String> list = new ArrayList<>();
        list.add("Hello"); // Допустимо
        // list = new LinkedList<>(); // Ошибка компиляции

4. Final параметр метода: Запрещает переприсваивание аргумента внутри метода, что улучшает читаемость и предотвращает ошибки.

    public void process(final String input) {
        // input = "changed"; // Ошибка компиляции
    }

Итог: final повышает безопасность, ясность кода (обозначая намерения) и может помогать JVM в оптимизации.