Answers:
类的静态初始化通常在以下事件之一首次发生之前立即发生:
参见JLS 12.4.1。
也可以通过使用Class.forName(fqn, true, classLoader)
或缩写来强制类进行初始化(如果尚未初始化)Class.forName(fqn)
1-JLS for Java 6至Java 8中存在最后的要点,但显然在规范中是错误的。最终在Java 9 JLS中对其进行了纠正:请参见source。
String
s被替换且未引用。如果class Other { public static final int VAL = 10; }
从某个类引用a MyClass { private int = Other.VAL; }
,Other
则不会加载该类。相反,编译器将在编译时仅替换final字段。
String
变量(仅由常量表达式初始化的变量)不是正确的。
static
通常的情况下,甚至不需要该字段。
静态字段在初始化期间初始化类加载(加载,链接和初始化) “阶段”阶段包括静态初始化程序及其静态字段的初始化。静态初始化器按照类中定义的文本顺序执行。
考虑示例:
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
未初始化。