Приведенный пример
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 о такой лени для классов, но является ли это документированной функцией интерфейса? Или просто деталь реализации JVM?