接口初始化不初始化超级接口



我在这里找到了这个代码,确切地说是Example 12.4.1-3. Interface Initialization Does Not Initialize Superinterfaces,比给定地址低一点。

interface I {
int i = 1, ii = Test.out("ii", 2);
}
interface J extends I {
int j = Test.out("j", 3), jj = Test.out("jj", 4);
}
interface K extends J {
int k = Test.out("k", 5);
}
class Test {
public static void main(String[] args) {
System.out.println(J.i);
System.out.println(K.j);
}
static int out(String s, int i) {
System.out.println(s + "=" + i);
return i;
}
}

答案是:

1
j=3
jj=4
3

问题是:jj=4是如何打印的?

如果JVM需要初始化接口,那么它将执行接口中的所有初始化,而不仅仅是您正在访问的变量。

在这种情况下,它不需要初始化I,因为它在其中使用了一个常量字段,这不会触发初始化,但它确实需要初始化J,因为它使用的是j,这不是编译时常量表达式。这样做意味着两个变量都被初始化。

编译器将K.j转换为J.j。因此,在您的代码中没有实际引用K

您在输出中看不到ii=2,因为在System.out.println(J.i);中,I.i的值被内联,所以代码中没有对I的引用。

最新更新