代码逻辑题之继承-静态代码块-main方法执行顺序

前提知识:

  (暂未发布)面向对象继承相关知识

  (暂未发布)static与静态代码块

  JVM入门之main方式详解

  (暂未发布)JVM加载类的顺序

总结: 

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
    }
}
答案及解析

 

posted @ 2019-03-18 23:45  等价交换原则  阅读(255)  评论(0编辑  收藏  举报