Всегда ли вызывается конструктор родительского класса при создании объекта?

«Всегда ли вызывается конструктор родительского класса при создании объекта?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, конструктор родительского класса вызывается всегда. Это фундаментальное правило цепочки вызовов конструкторов (constructor chaining) в Java.

Как это работает:

  1. При создании объекта любого класса неявно или явно вызывается конструктор его непосредственного родителя.
  2. Цепочка вызовов проходит вверх по иерархии наследования до класса Object.

Правила вызова:

  • Если в конструкторе дочернего класса не указан явный вызов super(...) или this(...), компилятор автоматически вставляет вызов конструктора родителя без аргументов super().
  • Если родительский класс не имеет конструктора по умолчанию (т.е. определен только конструктор с параметрами), то в дочернем классе обязательно нужно явно вызвать один из существующих конструкторов родителя через super(...), иначе будет ошибка компиляции.

Примеры:

// Пример 1: Неявный вызов super()
class Parent {
    Parent() { System.out.print("Parent -> "); } // Конструктор по умолчанию есть
}
class Child extends Parent {
    Child() { System.out.print("Child"); }
    // Компилятор добавит super();
}
// new Child() выведет: "Parent -> Child"

// Пример 2: Явный вызов super(...) ОБЯЗАТЕЛЕН
class Parent {
    Parent(int value) { // Нет конструктора по умолчанию
        System.out.print("Parent(" + value + ") -> ");
    }
}
class Child extends Parent {
    Child() {
        super(10); // ЯВНЫЙ ВЫЗОВ ОБЯЗАТЕЛЕН
        System.out.print("Child");
    }
}
// new Child() выведет: "Parent(10) -> Child"

// Пример 3: Ошибка компиляции
class ChildError extends Parent {
    ChildError() {
        // ОШИБКА: Implicit super constructor Parent() is undefined.
        System.out.print("Child");
    }
}

Вывод: Вызов конструктора родителя — обязательный и всегда первый шаг в выполнении конструктора дочернего класса.