Java接口静态字段延迟初始化
Java interface static field lazy initialization
举个例子
interface A {
static int aInit() {
System.out.println("Interface field");
return 42;
}
int a = aInit();
}
class B implements A {
static int bInit() {
System.out.println("Class field");
return 42;
}
static final int b = bInit();
}
A a = new B();
在 JDK8 和 JDK10 上都只打印 "Class field"
。直接访问 A.a
产生它的初始化和 "Interface field"
输出。
这表明接口静态字段初始化是惰性的,而对于最终静态class字段则不是这样。
我可以看到 OpenJDK JEP draft 关于 classes 的这种懒惰,但它是一个记录在案的界面功能吗?或者只是 JVM 实现的细节?
这是记录在案的行为。接口 A
将不会按照 https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1 进行初始化。它仅在调用字段 a
或方法 aInit()
时初始化。
举个例子
interface A {
static int aInit() {
System.out.println("Interface field");
return 42;
}
int a = aInit();
}
class B implements A {
static int bInit() {
System.out.println("Class field");
return 42;
}
static final int b = bInit();
}
A a = new B();
在 JDK8 和 JDK10 上都只打印 "Class field"
。直接访问 A.a
产生它的初始化和 "Interface field"
输出。
这表明接口静态字段初始化是惰性的,而对于最终静态class字段则不是这样。
我可以看到 OpenJDK JEP draft 关于 classes 的这种懒惰,但它是一个记录在案的界面功能吗?或者只是 JVM 实现的细节?
这是记录在案的行为。接口 A
将不会按照 https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1 进行初始化。它仅在调用字段 a
或方法 aInit()
时初始化。