Что делает ключевое слово `final` в Java?

«Что делает ключевое слово `final` в Java?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово final в Java применяется для объявления сущностей, которые не могут быть изменены после их первоначального определения.

Применение в трёх контекстах:

  1. final переменная/поле: Значение может быть присвоено только один раз (константа).

    final int MAX_USERS = 100;
    // MAX_USERS = 200; // Ошибка компиляции: cannot assign a value to final variable

    Для ссылочных типов неизменна сама ссылка, но состояние объекта можно менять.

    final List<String> list = new ArrayList<>();
    list.add("Hello"); // Можно: изменяется объект, а не ссылка
    // list = new ArrayList<>(); // Ошибка: нельзя изменить ссылку
  2. final метод: Невозможно переопределить (override) в дочерних классах.

    class Parent {
        final void secureMethod() {
            System.out.println("Этот метод нельзя изменить.");
        }
    }
    class Child extends Parent {
        // void secureMethod() { ... } // Ошибка компиляции
    }
  3. final класс: Невозможно унаследовать (extend).

    final class ImmutableClass { /* ... */ }
    // class SubClass extends ImmutableClass { } // Ошибка компиляции

Зачем это нужно? Для обеспечения безопасности, неизменяемости (immutability), проектирования API и предотвращения случайных изменений.