举个例子
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"
输出。
这表明接口静态字段初始化是惰性的,对于最终的静态类字段不是这样。
我可以看到OpenJDK JEP draft关于类的懒惰,但它是一个记录的界面功能?或者只是JVM实现的细节?
这是一种记录在案的行为。根据A
,接口https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1不会被初始化。它仅在字段a
或方法aInit()
被调用时初始化。