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

Java调试
请各位帮忙!!
现有三个类:AA类,BB类,CC类。代码如下:
public class AA { // 此处为1
public static int a=10; //此处为2
}
public class BB extends AA { //此处为3
public static int x=30; //此处为4
}
public class CC {
public static void main(String[] args) {
BB b=new BB(); //此处为5
}
}

在5那里设断点,按F5调试,执行顺序为:5→2→1→4→3 
请问从2至1的原因?

------解决方案--------------------
应该是表示该类的静态属性初始化完成
------解决方案--------------------
public class AA { // 此处为1 
public static int a=10; //此处为2
}
public class BB extends AA { //此处为3 
public static int x=30; //此处为4
}
public class CC { 
public static void main(String[] args) {
BB b=new BB(); //此处为5
BB b1 = new BB() ;// 此处为6
}
}


1、肯定先执行5,因为CC为启动类,main方法;
2、new BB()时,会加载BB类,而BB类有父类AA(非Object父类),所以加载AA,在加载AA的时,jvm会经过 加载、验证连接 、初始化静态变量 ,所以执行2 
3、然后new BB()对象时,需要初始化父类AA的非静态变量,所以重新运行AA类,所以 1
4、做完父类的加载和初始化非静态变量后,接着jvm装载BB类,和AA类一样,先初始化BB类的静态类变量,所以 4;
5、接着初始化非静态变量 ,所以3 ;

注 :如果再写一个 new BB()的话,即6哪里 的运行顺序应该为 6 ->1 ->3
因为 5的时候jvm已经对AA和BB进行加载并对类的静态类变量初始化 ,所以不在做 ;
------解决方案--------------------
类的静态变量 是在类在被jvm加载的时候初始化的,而不是在 创建对象的时候,如果创建对象的时候 ,类还没被jvm加载,那么需要加载,只有加载完成后才能创建对象 

所以静态变量总是先于非静态变量初始化 ,因为非静态变量初始化是要在创建对象的时候才做 ;


创建子类对象 ,jvm会加载父类,并初始化父类的静态变量 ;

创建子类对象时 ,会先初始化父类的非静态变量 ,然后运行父类的构造函数 ,接着初始化其非静态变量 在运行其构造函数 ;