Что верно про модификатор final в Java?
final-класс нельзя наследовать (String, Integer), final-метод нельзя переопределить, final-переменная или поле присваивается ровно один раз. final-ссылка не делает объект неизменяемым — менять его состояние можно.
- final-поле должно быть инициализировано в объявлении, блоке или каждом конструкторе
- Локальные переменные для лямбд — final или effectively final
- final-поля дают гарантию видимости после конструктора (модель памяти)
А ещё static final примитив или строка с константой — подставляется при компиляции
Подробно
| где | что запрещает |
|---|---|
| класс | наследование |
| метод | переопределение в подклассе |
| поле | повторное присваивание; инициализация обязательна |
| локальная переменная, параметр | повторное присваивание |
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-поле инициализировать в конструкторе?
Разбор темы
- final, static и порядок инициализации
Семантика final (и почему это не immutable), static-члены, порядок инициализации класса и объекта, константы и ловушки.
Связанные вопросы
- Что означает final для переменной-ссылки? Junior
- Библиотека объявляет public static final String VERSION = "1.0". В новой версии значение изменили на "2.0" и заменили только jar библиотеки. Что увидит уже скомпилированное приложение? Senior
- Что требуется, чтобы класс был ПО-НАСТОЯЩЕМУ неизменяемым? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.