单例模式执行排序问题



我正在尝试学习单例设计模式。代码如下:

public class Model {
private static final Model INSTANCE = new Model();
public static void main(String[] args) {
Model.getInstance();
}
private Model(){
System.out.println("constructor");
}
public static Model getInstance(){
System.out.println("I hope to be printed first!");
return INSTANCE;
}
}

我希望代码首先打印I hope to be printed first!,然后通过类构造函数。 但代码输出是相反的:

constructor
I hope to be printed first!

我不明白为什么首先实例化类?

静态变量在加载类时初始化。它们在创建该类的任何对象之前初始化。由于静态变量是在执行类的任何静态方法之前初始化的,因此您获得的输出符合预期。查看 https://beginnersbook.com/2013/05/static-variable/和 https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html 以获取更多详细信息和一些示例。

甚至在执行main()方法之前,JVM 类加载器将类加载到内存中。 此时,它初始化所有静态变量,并按照它们在类中出现的顺序(从上到下(执行静态初始化块。

因此,由于您的INSTANCE变量是静态的,因此必须对其进行初始化。因此,调用构造函数来创建类Model的实例,然后分配给INSTANCE变量。 由于这是唯一的静态变量,并且没有静态初始化块,因此正在执行main调用Model.getInstance()的方法。

当然,在编写初始化不同类型字段的代码时,我们必须注意初始化的顺序。

在 Java 中,初始化语句的顺序如下:

静态变量和静态初始值设定项按顺序排列

实例变量和实例初始值设定项的顺序

构造 函数

https://www.baeldung.com/java-initialization

最新更新