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

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

При создании экземпляра объекта в Java, конструкторы и блоки инициализации выполняются в определенном порядке, который зависит от иерархии классов и типа блока инициализации. Порядок инициализации объекта следующий: Пример иерархии классов и порядка инициализации: class Base {
static {
System.out.println("Static initialization block of Base");
}
{
System.out.println("Instance initialization block of Base");
}
Base() {
System.out.println("Constructor of Base");
}
}
class Derived extends Base {
static {
System.out.println("Static initialization block of Derived");
}
{
System.out.println("Instance initialization block of Derived");
}
Derived() {
System.out.println("Constructor of Derived");
}
}
public class Main {
public static void main(String[] args) {
new Derived();
}
} Результат выполнения кода: Static initialization block of Base
Static initialization block of Deriv

При создании экземпляра объекта в Java, конструкторы и блоки инициализации выполняются в определенном порядке, который зависит от иерархии классов и типа блока инициализации.

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

  • Статические блоки инициализации базового класса
  • Статические блоки инициализации производного класса
  • Не статические блоки инициализации базового класса
  • Конструктор базового класса
  • Не статические блоки инициализации производного класса
  • Конструктор производного класса

Пример иерархии классов и порядка инициализации:

class Base {
static {
System.out.println("Static initialization block of Base");
}

{
System.out.println("Instance initialization block of Base");
}

Base() {
System.out.println("Constructor of Base");
}
}

class Derived extends Base {
static {
System.out.println("Static initialization block of Derived");
}

{
System.out.println("Instance initialization block of Derived");
}

Derived() {
System.out.println("Constructor of Derived");
}
}

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

Результат выполнения кода:

Static initialization block of Base
Static initialization block of Derived
Instance initialization block of Base
Constructor of Base
Instance initialization block of Derived
Constructor of Derived

Таким образом, статические блоки инициализации выполняются первыми, затем не статические блоки инициализации, а затем конструкторы. При этом порядок выполнения блоков инициализации и конструкторов определяется иерархией классов.

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

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

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