gpt4 book ai didi

java - 为什么静态字段没有及时初始化?

转载 作者:IT老高 更新时间:2023-10-28 20:43:50 26 4
gpt4 key购买 nike

以下代码打印一次 null

class MyClass {
private static MyClass myClass = new MyClass();
private static final Object obj = new Object();
public MyClass() {
System.out.println(obj);
}
public static void main(String[] args) {}
}

为什么静态对象在构造函数运行前没有初始化?

更新

我刚刚复制了这个示例程序,我以为我们在谈论 2 个 Object 字段,现在我看到第一个是 MyClass 字段.. :/

最佳答案

因为静态是按照它们在源代码中给出的顺序初始化的。

看看这个:

class MyClass {
private static MyClass myClass = new MyClass();
private static MyClass myClass2 = new MyClass();
public MyClass() {
System.out.println(myClass);
System.out.println(myClass2);
}
}

这将打印:

null
null
myClassObject
null

编辑

好的,让我们把它画得更清楚一点。

  1. 静态数据按照源代码中声明的顺序一一初始化。
  2. 由于第一个静态字段在其余静态字段之前初始化,因此在初始化期间,其余静态字段为空值或默认值。
  3. 在第二个静态初始化期间,第一个静态是正确的,但其余的仍然是 null 或默认值。

清楚吗?

编辑 2

正如 Varman 指出的那样,在初始化时,对自身的引用将为空。如果您考虑一下,这是有道理的。

关于java - 为什么静态字段没有及时初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com