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

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

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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