Найти в Дзене
DEBAGanov

Java 725. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?

В Java конструкторы и блоки инициализации вызываются в определенном порядке при создании объекта. Для класса-потомка порядок вызова конструкторов и блоков инициализации следующий:

  • Сначала вызывается статический блок инициализации класса-родителя (если он есть).
  • Затем вызывается конструктор класса-родителя.
  • Выполняются блоки инициализации экземпляра класса-родителя (обычный блок инициализации, блок инициализации инстанса и блок инициализации final-полей).
  • Вызывается статический блок инициализации класса-потомка (если он есть).
  • Затем вызывается конструктор класса-потомка.
  • Выполняются блоки инициализации экземпляра класса-потомка (обычный блок инициализации, блок инициализации инстанса и блок инициализации final-полей).

Например, если у вас есть класс-родитель Parent и класс-потомок Child, то порядок вызова конструкторов и блоков инициализации будет следующим:

class Parent {
static {
System.out.println("Static init block in Parent");
}

{
System.out.println("Instance init block in Parent");
}

public Parent() {
System.out.println("Constructor in Parent");
}
}

class Child extends Parent {
static {
System.out.println("Static init block in Child");
}

{
System.out.println("Instance init block in Child");
}

public Child() {
System.out.println("Constructor in Child");
}
}

// Создаем объект класса Child Child child = new Child();

Этот код выведет следующий результат в консоль:

Static init block in Parent
Constructor in Parent
Instance init block in Parent
Static init block in Child
Constructor in Child

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov