Короткий ответ
Ключевое слово final означает запрет на изменение и используется в трёх основных смыслах: final-переменной значение присваивается только один раз, final-метод нельзя переопределить в наследнике, а от final-класса нельзя создавать подклассы. Именно так устроены String, Integer и другие классы-обёртки.
Как это работает подробнее
Если final стоит у ссылки на объект, менять саму ссылку нельзя, но состояние объекта по ней — можно (если объект сам не неизменяемый). final применяется и к параметрам методов: такой параметр нельзя переприсваивать внутри метода. Неизменяемые объекты, все поля которых объявлены final, безопасно публиковать и использовать в многопоточной среде без синхронизации.
- final-переменная — константа: присваивание при объявлении или в конструкторе, далее только чтение; переприсваивание даёт ошибку компиляции.
- final-метод — реализация зафиксирована в родительском классе и не может быть переопределена в подклассах.
- final-класс — наследование запрещено, поэтому поведение класса гарантированно не будет изменено наследниками.
Пример кода
FinalDemo.java
final class Config { // final-класс: наследование запрещено
final String name; // final-поле: присваивается один раз
Config(String name) {
this.name = name; // допустимо: присваивание в конструкторе
}
}
public class FinalDemo {
final void show() { } // final-метод: нельзя переопределить
public static void main(String[] args) {
final int max = 100; // final-переменная
// max = 200; // ошибка компиляции: нельзя переприсвоить
System.out.println(max);
}
}Что использовать на практике
- Объявляй final параметры и локальные переменные там, где значение не должно меняться: это самодокументация и защита от ошибок.