Java 静态成员变量和构造函数的执行顺序
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
分析编译流程及原因:
- 编译器首先会编译 Demo 类,发现其中有一个静态成员变量 cat 和一个静态方法 main,因此首先会加载 Cat 类和 Dog 类。
- 加载 Cat 类时,发现其中有一个静态成员变量 dog,会继续加载 Dog 类。
- 加载 Dog 类时,发现其中有一个无参构造方法,因此会打印出 'dog constructor'。
- 加载完毕后,编译器继续加载 Cat 类,发现其中有一个无参构造方法,因此会打印出 'cat constructor'。
- 加载完毕后,编译器继续加载 Demo 类,发现其中有一个静态成员变量 cat 和一个非静态成员变量 dog,以及一个 Demo 类的构造方法。
- 执行 main 方法时,会打印出 'hello world!'。
- 创建 Demo 对象 d 时,会调用 Demo 类的构造方法,因此会打印出 'demo constructor'。
总结:
Java 中静态成员变量和构造函数的执行顺序遵循以下原则:
- 静态成员变量在类加载时初始化,按照代码中的顺序依次执行。
- 构造函数在创建对象时执行,按照类继承关系的顺序执行。
- 静态方法在类加载后即可调用,与对象创建无关。
需要注意的是,代码的执行顺序与编译顺序并不完全一致。编译器会先将代码解析成字节码,然后按照字节码中的指令顺序执行代码。
原文地址: https://www.cveoy.top/t/topic/qi8z 著作权归作者所有。请勿转载和采集!