Вопрос с собеседования · Java

В каком порядке выполняется инициализация при создании объекта подкласса?

MiddleОсновы языка
Ещё спрашивают так:
  • В каком порядке инициализируются статические члены, поля и конструкторы при создании наследника?
  • В каком порядке инициализируются статические члены, поля объекта и конструкторы при создании экземпляра класса-наследника?
Коротко

Один раз при инициализации класса: static-поля и static-блоки — родитель, затем наследник. На каждый new: конструктор наследника сразу вызывает super(), отрабатывают поля и блоки родителя, тело его конструктора, затем поля и блоки наследника и тело его конструктора.

  • Поля и блоки — в порядке объявления
  • Ловушка: переопределённый метод, вызванный из конструктора родителя, видит поля наследника пустыми (null, 0)
  • Из конструктора не вызывают переопределяемые методы

А ещё Класс инициализируется лениво — при первом активном использовании

Подробно

Отсюда вытекает известная ловушка: если конструктор суперкласса вызывает метод, переопределённый в подклассе, тот выполнится до инициализации полей подкласса и увидит их значениями по умолчанию — null и нули. Именно поэтому из конструктора не вызывают переопределяемые методы. Вторая практическая деталь: статические блоки выполняются один раз при инициализации класса, а она происходит лениво — при первом создании объекта, обращении к статическому члену, не являющемуся константой времени компиляции, или обращении к статическому методу. Инициализаторы полей и блоки внутри одного класса выполняются в порядке их появления в тексте.

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

  • Порядок статической и экземплярной инициализации.
  • Ловушка с вызовом переопределённого метода.

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

  • Вызывать переопределяемый метод из конструктора.
  • Считать, что статический блок отработает в момент загрузки класса — он отработает при инициализации.

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

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Статика (при загрузке) → поля и блоки подкласса → поля и блоки суперкласса → конструктор суперкласса → конструктор подкласса
  • ✓Статика (при загрузке) → поля и блоки суперкласса → его конструктор → поля и блоки подкласса → его конструктор
  • ✗Инициализаторы полей подкласса → конструктор подкласса → конструктор суперкласса
  • ✗Порядок не определён спецификацией и зависит от реализации JVM

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

  • Что увидит переопределённый метод, вызванный из конструктора суперкласса?
  • Чем загрузка класса отличается от его инициализации?
  • Что такое константа времени компиляции и почему обращение к ней не инициализирует класс?
  • Чем отличается инициализация класса от его загрузки?

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования