Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与默认方法初始化的接口_Java_Methods_Interface_Default - Fatal编程技术网

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