何时调用构造函数

当创建超类对象时,首先执行哪一个构造函数?是子类的构造函数还是超类定义的构造函数?例如,已知一个名为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
如你所见,按照派生顺序来调用构造函数.
如果考虑下,就会发现按照继承顺序来执行是很合理的,因为超类不知道任何子类,需要执行的任何初始化与任何子类执行的初始化是相分离的,这可能是子类执行的初始化的先决条件.因此,必须首先完成超类的初始化.