Найти тему
DEBAGanov

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

В Java порядок вызова конструкторов и блоков инициализации в классе и его иерархии определяется следующим образом:

  1. Сначала вызывается статический блок инициализации родительского класса, если он есть.
  2. Затем вызывается конструктор родительского класса с передачей ему аргументов.
  3. Выполняются блоки инициализации родительского класса в порядке, указанном в коде.
  4. Вызывается конструктор наследуемого класса с передачей ему аргументов.
  5. Выполняются блоки инициализации наследуемого класса в порядке, указанном в коде.

Parent static block(s) → Child static block(s) → Grandchild static block(s)

→ Parent non-static block(s) → Parent constructor →

→ Child non-static block(s) → Child constructor →

→ Grandchild non-static block(s) → Grandchild constructor

Например, рассмотрим следующий код:

class Base {
static {
System.out.println("Статический блок инициализации базового класса");
}

Base() {
System.out.println("Конструктор базового класса");
}

{
System.out.println("Блок инициализации базового класса");
}
}

class Derived extends Base {
static {
System.out.println("Статический блок инициализации наследуемого класса");
}

Derived() {
System.out.println("Конструктор наследуемого класса");
}

{
System.out.println("Блок инициализации наследуемого класса");
}
}

public class Main {
public static void main(String[] args) {
Derived obj = new Derived();
}
}

При создании объекта класса Derived будет выполнен следующий порядок вызовов:

1 Вызов статического блока инициализации Base.

2. Вызов конструктора Base.

3. Выполнение блока инициализации Base.

4. Вызов статического блока инициализации Derived.

5. Вызов конструктора Derived.

6. Выполнение блока инициализации Derived.

Github: https://github.com/DEBAGanov