Ответ
В Java модификатор final можно применить к четырем основным элементам, накладывая ограничение на их изменение или расширение:
| Элемент | Эффект | Пример |
|---|---|---|
| Класс | Запрещает наследование от этого класса. | final class String { ... } |
| Метод | Запрещает переопределение (override) этого метода в подклассах. | public final void getInstance() { ... } |
| Переменная (поле) | Делает ссылку неизменяемой после инициализации. Состояние объекта, на который она указывает, может меняться. | final List<String> list = new ArrayList<>();list.add("item"); // OKlist = new LinkedList<>(); // Ошибка компиляции |
| Локальная переменная / параметр метода | Запрещает повторное присваивание переменной внутри её области видимости. | void process(final int param) {param = 5; // Ошибка компиляции} |
Ключевые моменты:
- Для примитивных типов
finalделает значение константой. - Для ссылочных типов
finalфиксирует ссылку, но не содержимое объекта (кроме случаев, когда сам класс immutable, какString). finalполя должны быть явно инициализированы до завершения конструктора.- Использование
finalспособствует безопасности потоков (thread-safety) для неизменяемых объектов и помогает компилятору в оптимизациях.