class SuperTest
{
private String name = “Default Name”; //1
public SuperTest(){
System.out.println(“SuperTest Construct”);//2
}
}class Test extends SuperTest
{
private static String const1 = “CONST”;//3
public Test(){
System.out.println(“Test Construct”); //4
}
public static void main(String[] args){
new Test(); //5
}
}
(A).3,5,1,2,4
(B).5,3,4,1,2
(C).3,5,2,4,1
(D).5,3,4,2,1
此时执行了:3和52、然后,判断该类是否存在extends继承关键字,如果有,在该Test()构造方法中,隐式调用父类SuperTest的构造方法。跳到父类里,首先判断父类类名后面有没有extends关键字,这里没有,所以执行了类里的属性或方法,这里执行了私有的name属性,在执行构造方法SuperTest()体,此时:输出:“SuperTest Construct”。执行了:1和23、执行完父类的构造方法后,回到子类的构造方法里,此时输出:“Test Construct”,此时执行了:4所以最后控制台的运行结果为:
SuperTest Construct
Test Construct4、执行步骤为:3 5 1 2 4
先初始化父类的静态代码--->初始化子类的静态代码-->
初始化父类的非静态代码--->初始化父类构造函数--->
初始化子类非静态代码--->初始化子类构造函数
父类的构造函数一定要先于子类的,即 2一定得在4前面。 所以B D肯定不对。
属性的初始化要先于构造函数的,所以C也错。
最后就是A对。3楼讲得很清楚,学习了!