给出的例子
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)字段”
输出。
这表明接口(interface)静态字段初始化是惰性的,而对于最终静态类字段则不然。
我可以看到OpenJDK JEP draft关于类的这种懒惰,但是它是接口(interface)的记录功能吗?或者只是 JVM 实现的细节?
最佳答案
这是一种记录在案的行为。接口(interface) A
将不会按照 https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1 进行初始化。仅当调用字段 a
或方法 aInit()
时,它才会被初始化。
关于Java接口(interface)静态字段延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399813/