В Java порядок вызова конструкторов и блоков инициализации в классе и его иерархии определяется следующим образом:
- Сначала вызывается статический блок инициализации родительского класса, если он есть.
- Затем вызывается конструктор родительского класса с передачей ему аргументов.
- Выполняются блоки инициализации родительского класса в порядке, указанном в коде.
- Вызывается конструктор наследуемого класса с передачей ему аргументов.
- Выполняются блоки инициализации наследуемого класса в порядке, указанном в коде.
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