[英]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"
。 直接訪問Aa
產生其初始化和"Interface field"
輸出。
這表明接口靜態字段初始化是惰性的,這對於最終靜態類字段而言並非如此。
我可以看到OpenJDK JEP 草案關於類的這種懶惰,但它是接口的記錄功能嗎? 或者只是JVM實現的一個細節?
這是一種記錄在案的行為。 接口A
不會按照https://docs.oracle.com/javase/specs/jls/se12/html/jls-12.html#jls-12.4.1進行初始化。 它僅在調用字段a
或方法aInit()
時初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.