Порядок вызова конструкторов

В каком порядке вызываются конструкторы классов, образующих иерархию, при ее создании? Например, какой конструктор вызывается раньше: А или В, если в — это подкласс, а А — суперкласс? В иерархии классов конструкторы вызываются в порядке наследования, начиная с суперкласса, и заканчивая подклассом. Более того, поскольку super () должен быть первым оператором, выполняемым в конструкторе подкласса, этот порядок остается неизменным, независимо от того, используется ли форма super (). Если конструктор super () не применяется, программа использует конструктор каждого суперкласса, заданный по умолчанию или не содержащий параметров. В следующей программе демонстрируется порядок выполнения конструкторов.

// Демонстрация порядка вызова конструкторов.
// Создание суперкласса, class А {
А() {
System.out.println("Внутри конструктора А.");
}
}
// Создание подкласса посредством расширения класса А.
class В extends А {
В() {
System.out.println("Внутри конструктора В.");
}
}
// Создание еще одного подкласса посредством расширения класса В.
class С extends В {
С() {
System.out.println("Внутри конструктора С.");
class CallingCons {
public static void main(String args[]) {
С с = new C();
}
}

Эта программа генерирует следующий вывод:

Внутри конструктора А
Внутри конструктора В
Внутри конструктора С

Как видите, конструкторы вызываются в порядке наследования.

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