В каком порядке вызываются конструкторы классов, образующих иерархию при ее создании? Например, какой конструктор вызывается раньше: АA() или ВB(), если ВB это подкласс, а АA суперкласс?
В иерархии классов конструкторы вызываются в порядке наследования, начиная с суперкласса и кончая подклассом.
Болеетого, этот порядок остается неизменным независимо от того, используется форма super() или нет, поскольку вызов метода super() должен быть в первом операторе, выполняемом в конструкторе подкласса.
Если метод super() не вызывается, то используется конструктор по умолчанию или же конструктор без параметровиз каждого суперкласса.
В следующем примере программы демонстрируется порядок вызова и выполнения конструкторов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
// Продемонстрировать порядок вызова конструкторов классов // создаем суперкласс AA class AA { AA() { System.out.println("В конструкторе AA."); } } // создаем подкласс путем расширения класса AA class BB extends AA { BB() { System.out.println("В конструкторе BB."); } } // очередной подкласс только уже расширяем от BB class CC extends BB { CC() { System.out.println("В конструкторе CC."); } } // еще одино подкласс, расширяем от CC class DD extends CC { DD() { System.out.println("В конструкторе DD."); } } // точка входа class ConstructorCall { public static void main(String args[]) { DD dd = new DD(); } } |
Программа выводит следующий результат:
1 2 3 4 5 6 7 |
pro-java.ru@admin:~$ javac constructor.java pro-java.ru@admin:~$ java ConstructorCall В конструкторе AA. В конструкторе BB. В конструкторе CC. В конструкторе DD. pro-java.ru@admin:~$ |
Как видите, конструкторы вызываются в порядке наследования. По зрелом размышлении становится ясно, что выполнение конструкторов в порядке наследования имеет определенный смысл.
Суперклассу ничего неизвестно о своих подклассах, и поэтому любая инициализация должна быть выполнена в нем совершеннонезависимо от любой инициализации, выполняемой подклассом. Следовательно, она должна выполняться в первую очередь.