即使重写了此方法,也会初始化具有默认方法的接口,即使它根本没有被调用。
示例:
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
这里究竟出现了什么问题?
答案 0 :(得分:0)
您已定义字段a
;编译器不知道你从未在实现中访问它。它必须运行方法来确定值。
int a = foo(); // <-- must run foo.
static int foo(){
System.out.println("I initialized"); // <-- prints I initialized
return 15;
}
和
a = 15
和test1
与test2
无关,但即使它foo()
仍然需要进行评估以设置a
。