В каком порядке выполняется инициализация при создании объекта подкласса?
- В каком порядке инициализируются статические члены, поля и конструкторы при создании наследника?
- В каком порядке инициализируются статические члены, поля объекта и конструкторы при создании экземпляра класса-наследника?
Один раз при инициализации класса: static-поля и static-блоки — родитель, затем наследник. На каждый new: конструктор наследника сразу вызывает super(), отрабатывают поля и блоки родителя, тело его конструктора, затем поля и блоки наследника и тело его конструктора.
- Поля и блоки — в порядке объявления
- Ловушка: переопределённый метод, вызванный из конструктора родителя, видит поля наследника пустыми (null, 0)
- Из конструктора не вызывают переопределяемые методы
А ещё Класс инициализируется лениво — при первом активном использовании
Подробно
Отсюда вытекает известная ловушка: если конструктор суперкласса вызывает метод, переопределённый в подклассе, тот выполнится до инициализации полей подкласса и увидит их значениями по умолчанию — null и нули. Именно поэтому из конструктора не вызывают переопределяемые методы. Вторая практическая деталь: статические блоки выполняются один раз при инициализации класса, а она происходит лениво — при первом создании объекта, обращении к статическому члену, не являющемуся константой времени компиляции, или обращении к статическому методу. Инициализаторы полей и блоки внутри одного класса выполняются в порядке их появления в тексте.
Что хотят услышать
- Порядок статической и экземплярной инициализации.
- Ловушка с вызовом переопределённого метода.
Частые ошибки
- Вызывать переопределяемый метод из конструктора.
- Считать, что статический блок отработает в момент загрузки класса — он отработает при инициализации.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Статика (при загрузке) → поля и блоки подкласса → поля и блоки суперкласса → конструктор суперкласса → конструктор подкласса
- ✓Статика (при загрузке) → поля и блоки суперкласса → его конструктор → поля и блоки подкласса → его конструктор
- ✗Инициализаторы полей подкласса → конструктор подкласса → конструктор суперкласса
- ✗Порядок не определён спецификацией и зависит от реализации JVM
Что спросят дальше
- Что увидит переопределённый метод, вызванный из конструктора суперкласса?
- Чем загрузка класса отличается от его инициализации?
- Что такое константа времени компиляции и почему обращение к ней не инициализирует класс?
- Чем отличается инициализация класса от его загрузки?
Разбор темы
- final, static и порядок инициализации
Семантика final (и почему это не immutable), static-члены, порядок инициализации класса и объекта, константы и ловушки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.