什么时候初始化静态字段?如果我从不实例化一个类,但我访问了一个静态字段,那么所有用于实例化私有静态字段的静态块和私有静态方法是否在那一刻被调用(按顺序)?
如果我调用静态方法怎么办?它是否也运行所有静态块?方法之前?
原文由 Tony R 发布,翻译遵循 CC BY-SA 4.0 许可协议
什么时候初始化静态字段?如果我从不实例化一个类,但我访问了一个静态字段,那么所有用于实例化私有静态字段的静态块和私有静态方法是否在那一刻被调用(按顺序)?
如果我调用静态方法怎么办?它是否也运行所有静态块?方法之前?
原文由 Tony R 发布,翻译遵循 CC BY-SA 4.0 许可协议
静态字段在类加载(加载、链接和初始化)的 初始化“阶段”期间被初始化,其中包括静态初始化器和其静态字段的初始化。静态初始化程序按照类中定义的文本顺序执行。
考虑这个例子:
public class Test {
static String sayHello() {
return a;
}
static String b = sayHello(); // a static method is called to assign value to b.
// but its a has not been initialized yet.
static String a = "hello";
static String c = sayHello(); // assignes "hello" to variable c
public static void main(String[] arg) throws Throwable {
System.out.println(Test.b); // prints null
System.out.println(Test.sayHello()); // prints "hello"
}
}
Test.b 打印 null
因为当在静态范围内调用 sayHello
时,静态变量 a
未初始化。
原文由 naikus 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
类的静态初始化通常发生在以下事件之一第一次发生之前:
请参阅 JLS 12.4.1 。
也可以通过使用
Class.forName(fqn, true, classLoader)
或缩写形式Class.forName(fqn)
强制类初始化(如果它尚未初始化)看上面。
作为静态类初始化的一部分;看上面。
是的。 (模数没有什么是真正瞬时的。)
是的,是的。
请注意,可以构造代码,您可以在其中观察静态字段的 默认初始化 值。
1 - 最后的要点出现在 Java 6 到 Java 8 的 JLS 中,但这显然是规范中的一个错误。它最终在 Java 9 JLS 中得到纠正:请参阅 source 。