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() 时初始化。