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
,因为inSystem.out.println(J.i)
内联I.I
的值,以便在代码中不引用I
。如果JVM需要初始化接口,那么它将在接口中进行所有初始化,而不仅仅是访问变量
在这种情况下,它不需要初始化
I
,因为它使用了一个常量字段,该字段不会触发初始化,但它确实需要初始化J
,因为它使用的是J
,这不是编译时常量表达式。这样做意味着两个变量都被初始化。是的,但问题是,为什么打印jj=4
?因为正如您所说,emK.j
是j.j
,不是j.jj
,而是打印j.jj
。我假设如果处理了从所述接口初始化的所有字段,则打印j.jj
。