В каком порядке вызываются конструкторы и блоки инициализации с учетом иерархии классов в Java?
При создании объекта в иерархии классов Java сначала при загрузке классов один раз выполняются их статические блоки инициализации и статические поля — сверху вниз по иерархии (от суперкласса к подклассу). Затем при каждом создании объекта для каждого класса по цепочке наследования последовательно выполняются его нестатические блоки инициализации и конструктор, также от предка к наследнику.
При создании объекта в иерархии классов JVM сначала при первой загрузке каждого класса выполняет его статические поля и статические блоки инициализации один раз за всё время работы программы — в порядке от самого базового суперкласса к самому «нижнему» подклассу. Затем при непосредственном создании объекта для каждого класса в цепочке наследования последовательно выполняются его нестатические поля и блоки инициализации, а затем конструктор (также сверху вниз по иерархии); вызов конструктора предка обеспечивается явным или неявным вызовом super() в начале конструктора подкласса.
Пример:
В примере порядок вывода будет следующим:
Static initialization block of SubClass — статический блок инициализации класса SubClass.Constructor of SuperClass — конструктор суперкласса SuperClass.Instance initialization block of SubClass — блок инициализации экземпляра класса SubClass.Constructor of SubClass — конструктор подкласса SubClass.Таким образом, вывод программы будет:
Отметьте свой прогресс