从超类继承方法而不是从java 8中实现接口继承默认方法的意义

从超类继承方法而不是从java 8中实现接口继承默认方法的意义,java,java-8,default-method,Java,Java 8,Default Method,在阅读《java 8默认方法》时,我遇到了以下段落: 如果层次结构中的任何类都有一个具有相同签名的方法,那么默认方法将变得不相关。默认方法无法重写java.lang.Object中的方法。推理非常简单,因为Object是所有java类的基类。所以,即使我们将对象类方法定义为接口中的默认方法,它也将是无用的,因为始终使用对象类方法。这就是为什么为了避免混淆,我们不能有覆盖对象类方法的默认方法 我很快尝试了以下代码来确认该行为 public class DefaultMethodClass {

在阅读《java 8默认方法》时,我遇到了以下段落:

如果层次结构中的任何类都有一个具有相同签名的方法,那么默认方法将变得不相关。默认方法无法重写java.lang.Object中的方法。推理非常简单,因为Object是所有java类的基类。所以,即使我们将对象类方法定义为接口中的默认方法,它也将是无用的,因为始终使用对象类方法。这就是为什么为了避免混淆,我们不能有覆盖对象类方法的默认方法

我很快尝试了以下代码来确认该行为

public class DefaultMethodClass {
    public void defaultMethod() 
    {
        System.out.println("DefaultMethodClass.defaultMethod()");
    }
}

public interface DefaultMethodInterface {
    public default void defaultMethod() 
    {
        System.out.println("DefaultMethodInterface.defaultMethod()");
    }
}

public class DefaultMethodClassInterfaceChild extends DefaultMethodClass implements DefaultMethodInterface  
{
    public static void main(String[] args) {
        (new DefaultMethodClassInterfaceChild()).defaultMethod();
    }
}
这张照片

DefaultMethodClass.defaultMethod()
我看不出语言设计师选择这种特殊行为背后的任何具体原因。他们有没有这么重要的原因让我失踪?或者只是接口默认方法在逻辑上不如超级类提供的具体实现重要

我看不出语言设计师选择这种特殊行为背后的任何具体原因

方法定义在Java1.0中,接口默认方法在Java8中添加。为Java1.0编写的代码仍然需要工作

或者只是接口默认方法在逻辑上不如超级类提供的具体实现重要


实际上,在编写了20多年的现有代码之后,它们的重要性就降低了。

答案很简单:您可以实现多个
接口
,但您可以只扩展一个
。实际上,通过实现多个接口,您不能有多个同名的
default
方法

如果在任何情况下,
default
方法的优先级高于在层次结构中的实际类中实现的方法,那么最终会遇到Java设计人员不希望多重继承的相同问题:歧义


个人观点:默认方法被视为“未定义任何功能时的功能实现”,如果该方法是在真实类中定义的,则它应该是更具体的实现。

即使没有向后兼容Java 8之前的代码,当将
default
方法添加到接口时,允许
default
方法重写现有方法可能会导致现有代码的意外行为。另请参阅