В 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