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

Java 接口初始化不初始化超级接口,java,interface,jls,Java,Interface,Jls,我找到了这个代码,精确地说是示例12.4.1-3。接口初始化不初始化超级接口,比给定地址低一点 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 = T

我找到了这个代码,精确地说是
示例12.4.1-3。接口初始化不初始化超级接口
,比给定地址低一点

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
是如何打印的?

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


您在输出中看不到
ii=2
,因为in
System.out.println(J.i)
内联
I.I
的值,以便在代码中不引用
I

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


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

是的,但问题是,为什么打印
jj=4
?因为正如您所说,em
K.j
j.j
,不是
j.jj
,而是打印
j.jj
。我假设如果处理了从所述接口初始化的所有字段,则打印
j.jj