【问题标题】:Interface with default method Initialisation [duplicate]具有默认方法初始化的接口[重复]
【发布时间】:2015-01-11 10:26:13
【问题描述】:

具有默认方法的接口会被初始化,即使该方法被覆盖并且根本没有被调用。

例子:

    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

这到底是什么问题?

【问题讨论】:

  • 这里有什么问题?
  • 根据 JLS 8 12.4.1 节,这种情况不会触发接口初始化

标签: java methods interface default


【解决方案1】:

您已定义字段a;编译器不知道您在实现中永远不会访问它。它必须运行方法来确定值。

int a = foo(); // <-- must run foo.
static int foo(){
    System.out.println("I initialized"); // <-- prints I initialized 
    return 15;
}

a = 15

并且test1test2 无关,但即使它确实foo() 仍需要评估以设置a

【讨论】:

  • 但是根据 JLS 第 12.4.1 节,test2 的调用应该初始化类 C 及其超类,而不是它的超接口。
  • JLS-12.4.1 并向下滚动示例 12.4.1-3。接口初始化不初始化超接口并注意i = 1首先打印(如您的问题中所示)并且您在这里没有接口K。
  • 这是因为对静态字段的引用导致仅初始化实际声明它的类或接口。
  • 您要解决什么问题,this如何帮助您解决问题?
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 2017-08-16
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多