Ответ
Да, конструктор родительского класса вызывается всегда. Это фундаментальное правило цепочки вызовов конструкторов (constructor chaining) в Java.
Как это работает:
- При создании объекта любого класса неявно или явно вызывается конструктор его непосредственного родителя.
- Цепочка вызовов проходит вверх по иерархии наследования до класса
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");
}
}
Вывод: Вызов конструктора родителя — обязательный и всегда первый шаг в выполнении конструктора дочернего класса.