Что означает final для переменной-ссылки?
- Что делает final у переменной?
- Можно ли изменить объект, на который указывает final-ссылка?
- Где можно использовать final в Java?
final у ссылки запрещает переприсваивание, но объект по ней менять можно.
final List<String> list— нельзяlist = ..., но можноlist.add(...)- Неизменяемость даёт неизменяемый тип:
List.of, record, immutable-класс
А ещё final ещё бывает у метода (нельзя переопределить) и класса (нельзя наследовать)
Подробно
Модификатор final у переменной означает, что ей можно присвоить значение только один раз. Для примитива это и есть неизменность значения. Для ссылки — неизменна только сама ссылка: она всегда будет указывать на тот же объект, но состояние объекта это не защищает.
Чтобы данные действительно нельзя было поменять, нужен неизменяемый объект: List.of(...) и Collections.unmodifiableList, record с неизменяемыми полями, собственный immutable-класс.
Другие применения final:
- метод — нельзя переопределить в наследнике;
- класс — от него нельзя наследоваться (
String); - поле — должно быть присвоено в конструкторе или при объявлении;
final-поля дают гарантию видимости после завершения конструктора для других потоков; - effectively final — переменная, которую не переприсваивают; только такие можно использовать в лямбдах и анонимных классах.
Пример
final List<String> names = new ArrayList<>();
names.add("Аня"); // можно — меняем объект
// names = new ArrayList<>(); // ошибка компиляции — переприсваивание
final List<String> fixed = List.of("Аня");
fixed.add("Боря"); // UnsupportedOperationExceptionЧто хотят услышать
- Ссылку переназначить нельзя, объект менять можно.
- Как добиться реальной неизменяемости.
- Другие значения final: метод, класс, поле.
- Effectively final и лямбды — плюс.
Частые ошибки
- Считать, что final List нельзя дополнять — можно, нельзя только переназначить ссылку.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Переменная становится статической
- ✗Значение вычисляется лениво при первом доступе
- ✓Ссылку нельзя переназначить, но объект может меняться
- ✗Объект, на который указывает ссылка, становится неизменяемым
Что спросят дальше
- Что означает final для метода и класса?
- Зачем final-поля в многопоточности?
Разбор темы
- final, static и порядок инициализации
Семантика final (и почему это не immutable), static-члены, порядок инициализации класса и объекта, константы и ловушки.
Связанные вопросы
- Что верно про модификатор final в Java? Junior
- В каком порядке выполняется инициализация при создании объекта подкласса? Middle
- Библиотека объявляет public static final String VERSION = "1.0". В новой версии значение изменили на "2.0" и заменили только jar библиотеки. Что увидит уже скомпилированное приложение? Senior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.