请各位帮忙!!
现有三个类: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的原因?
现有三个类: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 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会加载父类,并初始化父类的静态变量 ;创建子类对象时 ,会先初始化父类的非静态变量 ,然后运行父类的构造函数 ,接着初始化其非静态变量 在运行其构造函数 ;
public class AA {// 此处为1
public static int a=10;//此处为2
public int b=20; //此处为6
public AA(){}; //此处为7
}
public class BB extends AA {//此处为3
public static int x=30;//此处为4
public int y=40; //此处为8
public BB(){}; //此处为9
}
public class CC {
public static void main(String[] args) {
BB b=new BB();//此处为5
}
}在5那里设断点,按F5调试,执行顺序为:5→2→1→4→3→5→9→7→6→8→5
请问从2至1的原因?
new BB()时,会加载BB类,而BB类有父类AA(非Object父类),所以加载AA,在加载AA的时,jvm会经过 加载、验证连接 、初始化静态变量 ,所以执行2
然后new BB()对象时,需要初始化父类AA的非静态变量,所以重新运行AA类,所以 1