代码逻辑题之继承-静态代码块-main方法执行顺序
前提知识:
总结:
JVM加载类的执行顺序 先父后子 类变量(static成员变量)-->静态代码块-->main函数 将构造函数加载栈中- ->加载成员变量/代码块--调用构造函数并返回
public class ParentMainTest {
static int x;
static {
x++;
System.out.println("ParentMainTest_static_x:" + x);
}
public static void main(String[] args) {
new SonMainTest(8);
}
int n = 10;
{
n++;
System.out.println("ParentMainTest_nostatic_n:" + n);
}
}
public class SonMainTest extends ParentMainTest{
SonMainTest(int a){
this.a=a;
System.out.println("SonMainTest.a=" + a );
}
int a;
{
System.out.println("SonMainTest_nostatic_a:"+this.a);
}
static{
x++;
System.out.println("SonMainTest_static..." +x);
}
}
输出结果: ParentMainTest_static_x:1 SonMainTest_static...2 ParentMainTest_nostatic_n:11 SonMainTest_nostatic_a:0 SonMainTest.a=8 JVM加载类的执行顺序 先父后子 类变量(static成员变量)-->静态代码块-->main函数 将构造函数加载栈中- ->加载成员变量/代码块--调用构造函数并返回 //step0 JVM装载对应的.class字节码文件 public class ParentMainTest { static int x; //step1:初始化类变量 x默认值int类型为0,Integer为null static { //step2:初始化静态代码块 x++;//step2.1 x自增 x值为1 System.out.println("ParentMainTest_static_x:" + x);//step2.2 输出ParentMainTest_static...1 } public static void main(String[] args) {//step3:执行main函数 new SonMainTest(8);//step4:将SonMainTest.class加载的jvm,通过构造函数初始化SonMainTest对象 } int n = 10; //step10: 构造函数加载实例成员变量 { //step11: 构造函数加载实例成员代码块 n++; //step11.1 n=11; System.out.println("ParentMainTest_nostatic_n:" + n); ////step11.2 输出ParentMainTest_nostatic_n:11 } } public class SonMainTest extends ParentMainTest{ ` SonMainTest(int a){ //step8:执行new SonMainTest构造函数 //默认调用父类的无参构造函数 super(); step9:加载实例成员变量与成员代码块 this.a=a; //step14:将实例变量赋值 a=8 System.out.println("SonMainTest.a=" + this.a ); //step15:输出SonMainTest.a=8 } int a; //step12:加载实例变量 默认值为0; { System.out.println("SonMainTest_nostatic_a:"+this.a); //step13:加载成员代码块 输出SonMainTest_nostatic_a:0 } static{ //step5: 无类变量加载,加载静态代码块 x++; //step6: 获得父类的类变量值x=1,自增 x=2; System.out.println("SonMainTest_static..." +x);//step7: 输出SonMainTest_static...2 } }