当创建超类对象时,首先执行哪一个构造函数?是子类的构造函数还是超类定义的构造函数?例如,已知一个名为childClass的子类和一个名为parentClass的超类,是先调用超类的构造函数,还是先调用子类的构造函数?答案是:在类的层次结构中,构造函数的调用是按照继承的顺序,从超类到子类来进行的.不仅如此,因为super()必须是子类构造函数中执行的第一条语句,所以无论是否使用super(),构造函数的调用顺序都是相同的.如果没有使用super(),就会执行每个超类默认(无形参)构造函数:
public class test2 { // @param args public static void main(String args[]) { finalChildClass $obj = new finalChildClass(); } } class finalChildClass extends childClass { finalChildClass() { super(); System.out.println("finalChildClass init"); } String methodA() { return "methodA"; } int superPublicReturnInt() { return super.superPublicReturnInt(); } } class childClass extends parentClass { childClass() { super(100); System.out.println("childClass init"); } int publicReturnInt() { return 0; } int superPublicReturnInt() { return super.publicReturnInt(); } } class parentClass { private int num; parentClass(int n) { System.out.println("parentClass init "+n); num = n; } int publicReturnInt() { return returnInt(); } private int returnInt() { return num; } }
输出:
parentClass init 100 childClass init finalChildClass init
如你所见,按照派生顺序来调用构造函数.
如果考虑下,就会发现按照继承顺序来执行是很合理的,因为超类不知道任何子类,需要执行的任何初始化与任何子类执行的初始化是相分离的,这可能是子类执行的初始化的先决条件.因此,必须首先完成超类的初始化.