目录

执行顺序:

 一个简单Demo

复杂Demo

 顺序解析:


执行顺序:

  1. 父类静态代码块(static) ->

  2. 子类静态代码块(static) ->

  3. 父类非静态代码块 ->

  4. 父类构造函数 ->

  5. 子类非静态代码块 ->

  6. 子类构造函数

tips:

  • 执行遵循static优先原则
  • 静态代码块在类加载时执行,类加载在编译阶段(生成.class文件)完成,即只一次运行只执行一次
  • 当new对象的时候,从上至下执行一次非静态初始化语句和初始化块
  • 构造函数在创建对象时执行

 一个简单Demo

package explore.testEntity;

public class testClass {

    private String phone = a();
    private static String phone1 = a();

    static {
        System.out.println("static执行");
    }
    public static String a(){
        System.out.println("调用static方法a");
        return "调用static方法a";
    }
    public testClass(){
        System.out.println("构造函数");
    }
    {
        System.out.println("非静态内容");
    }


    public static void main(String[] args) {
        testClass tc = new testClass();
       
    }
}

 

复杂Demo

package explore.testEntity;

public class testClass {

    private static int k = 1;
    private static testClass t1 = new testClass("t1");
    private static testClass t2 = new testClass("t2");
    private static int i = print("i");
    private static int n = 99;

    {
        print("初始化块");
    }

    public testClass(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "   n=" + n);
        ++i;
        ++n;
    }

    static {
        print("静态块");
        n = 100;
    }

    private int j = print("j");

    public static int print(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "   n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        testClass tc = new testClass("explore.testClass.test");

    }
}

 

 顺序解析:

  1. 首先执行main函数,创建一个新对象
  2. 第一次创建该类的对象,进行类的编译
  3. 首先从上至下执行静态部分
  4. k=1
  5. 执行创建t1对象
    1. 当一个内部创建一个他自身的对象的时候,不执行静态部分
    2. 从上至下执行非静态部分
    3. 非静态代码块调用print方法
      1. k为1,str为参数“初始化块”,i,j未赋值,为0(Integer包装类型未赋值才为null),i、n自增,return i
    4. 执行int j赋值
      1. 调用print方法
    5. 非静态方法执行完毕,执行构造函数public testClass(String str){...省略...}
    6. 构造函数执行完毕,t1对象创建完成
  6. 执行创建t2对象
    1. 创建过程同t1,只是i,k值始终在该类内部使用,数据一直在迭代
  7. 为i赋值
    1. ​​​​​​​调用print方法
  8. 为n赋值
  9. 执行静态代码块
    1. ​​​​​​​调用print方法
    2. n=100
  10. 静态部分执行完毕,从上至下执行非静态部分
  11. 非静态代码块
    1. ​​​​​​​调用print方法
  12. 为j赋值
    1. ​​​​​​​调用print方法
  13. ​​​​​​​非静态部分执行完毕,执行构造函数
  14. main方法中的创建对象执行完毕
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐