在Java中,一个类只能扩展一个父类,但可以实现多个接口。

在Java 8接口中引入默认方法后,一类可能会继承多个
通过实现2个具有相同默认方法的接口来实现具有相同签名的方法
像在C++中那样会产生钻石问题

以下代码示例输出

new C().hello(); is

这是第二
   public interface First {

    default void hello(){
        System.out.println("This is First");
    }
}

 public interface Second extends First {

    default void hello(){
        System.out.println("This is Second");
    }
}

  public class MyClass implements First,Second {

    public static void main(String[] args) {
        new MyClass().hello();
    }
}

Java用于解决钻石问题的解决规则是什么?
一个简单的答案,例如谁占上风,什么时候占上风。

最佳答案

当类从多个位置(另一个类或接口)继承具有相同签名的方法时,请遵循以下规则:

  • 类总是赢。类或超类中的方法声明
    优先于任何默认方法声明。
  • 否则,子接口将获胜:最具体默认值中具有相同签名的方法
    界面被选中。 (例如,在您的案例中,Second接口中的方法应在Second扩展First时运行)。
  • 最后,如果选择仍然不明确,则从多个接口继承的类必须
    通过覆盖它并调用来显式选择要使用的默认方法实现
    明确的所需方法。
  • 10-01 05:02
    查看更多