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

Что верно про модификатор final в Java?

JuniorОсновы языка
Коротко

final-класс нельзя наследовать (String, Integer), final-метод нельзя переопределить, final-переменная или поле присваивается ровно один раз. final-ссылка не делает объект неизменяемым — менять его состояние можно.

  • final-поле должно быть инициализировано в объявлении, блоке или каждом конструкторе
  • Локальные переменные для лямбд — final или effectively final
  • final-поля дают гарантию видимости после конструктора (модель памяти)

А ещё static final примитив или строка с константой — подставляется при компиляции

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

Подробно

гдечто запрещает
класснаследование
методпереопределение в подклассе
полеповторное присваивание; инициализация обязательна
локальная переменная, параметрповторное присваивание
final List<String> list = new ArrayList<>();
list.add("ok");           // можно: меняем объект
list = new ArrayList<>(); // ошибка компиляции: меняем ссылку

Зачем final-классы: гарантировать поведение (String нельзя подменить подклассом), основа неизменяемости. final-методы — защитить шаг алгоритма от переопределения (например, в Template Method).

Модель памяти: поля final, записанные в конструкторе, видны любому потоку после завершения конструктора, если this не утёк — основа потокобезопасности неизменяемых объектов.

Константы времени компиляции: static final int MAX = 10 подставляется в код потребителей при компиляции — при смене значения в библиотеке их нужно перекомпилировать.

Что хотят услышать

  • Смысл final для класса, метода, переменной.
  • final-ссылка и изменяемый объект.
  • Связь с неизменяемостью.

Частые ошибки

  • Считать final аналогом immutable.
  • Думать, что final-метод нельзя перегрузить.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓final-класс нельзя наследовать
  • ✓final-метод нельзя переопределить в подклассе
  • ✗final-ссылка запрещает менять состояние объекта, на который она указывает
  • ✓final-поле должно быть инициализировано ровно один раз

Что спросят дальше

  • Чем final отличается от immutable?
  • Можно ли final-поле инициализировать в конструкторе?

Разбор темы

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

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

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

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

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