Java 与默认方法初始化的接口
具有默认方法的接口将被初始化,即使该方法已被重写,即使它根本未被调用 例如:Java 与默认方法初始化的接口,java,methods,interface,default,Java,Methods,Interface,Default,具有默认方法的接口将被初始化,即使该方法已被重写,即使它根本未被调用 例如: public interface I { int a = foo(); default void test1(){ } static int foo(){ System.out.println("I initialized"); return 15; } } public class C implements I{
public interface I {
int a = foo();
default void test1(){
}
static int foo(){
System.out.println("I initialized");
return 15;
}
}
public class C implements I{
public void test2(){
System.out.print("C initialized");
}
}
public class Test {
public static void main(String[] args) {
C c = new C();
c.test2();
}
}
打印:
I initialized
C initialized
这里到底出了什么问题?您已经定义了字段
a
;编译器不知道您从未在实现中访问它。它必须运行方法来确定值
int a = foo(); // <-- must run foo.
static int foo(){
System.out.println("I initialized"); // <-- prints I initialized
return 15;
}
而
test1
与test2
无关,但即使它与foo()
无关,仍然需要对其进行评估以设置a
这里的问题是什么?根据第12.4.1节中的JLS 8,这种情况不会触发接口初始化,但根据JLS第12.4.1节,test2的调用应该初始化类C及其超类,而不是它的超接口。并向下滚动示例12.4.1-3。接口初始化不会初始化SuperInterface,请注意,i=1
首先打印(如您的问题所示),并且此处没有接口K。这是因为对静态字段的引用只会导致初始化实际声明它的类或接口。您试图解决什么问题,这有助于你解决这个问题吗?
a = 15