日期:2014-05-20  浏览次数:20674 次

高手来看看,关于类的执行顺序问题
Java code

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




------解决方案--------------------
答案选:A

1、Test在new对象的时候调用了Test()构造方法,在此之前这个类的static修饰的属性name也在内存分配了空间。所以首先在使用类的时候初始化了该类的静态属性,在是调Test()构造方法。
此时执行了:3和5

2、然后,判断该类是否存在extends继承关键字,如果有,在该Test()构造方法中,隐式调用父类SuperTest的构造方法。跳到父类里,首先判断父类类名后面有没有extends关键字,这里没有,所以执行了类里的属性或方法,这里执行了私有的name属性,在执行构造方法SuperTest()体,此时:输出:“SuperTest Construct”。执行了:1和2

3、执行完父类的构造方法后,回到子类的构造方法里,此时输出:“Test Construct”,此时执行了:4

所以最后控制台的运行结果为:
SuperTest Construct
Test Construct

4、执行步骤为:3 5 1 2 4
------解决方案--------------------
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。 
先初始化父类的静态代码--->初始化子类的静态代码--> 
初始化父类的非静态代码--->初始化父类构造函数---> 
初始化子类非静态代码--->初始化子类构造函数
------解决方案--------------------
我选a的理由:
父类的构造函数一定要先于子类的,即 2一定得在4前面。 所以B D肯定不对。
属性的初始化要先于构造函数的,所以C也错。
最后就是A对。

3楼讲得很清楚,学习了!