Получить доступ

Что означает final для переменной-ссылки?

JuniorОсновы языка
Ещё спрашивают так:
  • Что делает final у переменной?
  • Можно ли изменить объект, на который указывает final-ссылка?
  • Где можно использовать final в Java?
Коротко

final у ссылки запрещает переприсваивание, но объект по ней менять можно.

  • final List<String> list — нельзя list = ..., но можно list.add(...)
  • Неизменяемость даёт неизменяемый тип: List.of, record, immutable-класс

А ещё final ещё бывает у метода (нельзя переопределить) и класса (нельзя наследовать)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Модификатор 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-поля в многопоточности?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем