Java 静态成员变量和构造函数的执行顺序

代码示例:

public class Demo {
  static Cat cat = new Cat(); 
  Dog dog = new Dog();
  Dog dog2;
  static Dog dog3;

  public static void main(String[] args) {
    System.out.println('hello world!');
    Demo d = new Demo();
  }

  public Demo() {
    System.out.println('demo constructor');
  }
}

class Cat {
  static Dog dog = new Dog();

  public Cat() {
    System.out.println('cat constructor');
  }
}

class Dog {
  public Dog() {
    System.out.println('dog constructor');
  }
}

编译结果:

hello world!
dog constructor
cat constructor
demo constructor

分析编译流程及原因:

  1. 编译器首先会编译 Demo 类,发现其中有一个静态成员变量 cat 和一个静态方法 main,因此首先会加载 Cat 类和 Dog 类。
  2. 加载 Cat 类时,发现其中有一个静态成员变量 dog,会继续加载 Dog 类。
  3. 加载 Dog 类时,发现其中有一个无参构造方法,因此会打印出 'dog constructor'。
  4. 加载完毕后,编译器继续加载 Cat 类,发现其中有一个无参构造方法,因此会打印出 'cat constructor'。
  5. 加载完毕后,编译器继续加载 Demo 类,发现其中有一个静态成员变量 cat 和一个非静态成员变量 dog,以及一个 Demo 类的构造方法。
  6. 执行 main 方法时,会打印出 'hello world!'。
  7. 创建 Demo 对象 d 时,会调用 Demo 类的构造方法,因此会打印出 'demo constructor'。

总结:

Java 中静态成员变量和构造函数的执行顺序遵循以下原则:

  • 静态成员变量在类加载时初始化,按照代码中的顺序依次执行。
  • 构造函数在创建对象时执行,按照类继承关系的顺序执行。
  • 静态方法在类加载后即可调用,与对象创建无关。

需要注意的是,代码的执行顺序与编译顺序并不完全一致。编译器会先将代码解析成字节码,然后按照字节码中的指令顺序执行代码。

Java 静态成员变量和构造函数的执行顺序

原文地址: https://www.cveoy.top/t/topic/qi8z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录