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

ani*_*nir 2 java java-8 default-method

我从这里阅读有关java 8默认方法时遇到了以下段落:

如果层次结构中的任何类具有具有相同签名的方法,则默认方法变得无关紧要.默认方法不能覆盖java.lang.Object中的方法.原因很简单,因为Object是所有java类的基类.因此,即使我们将Object类方法定义为接口中的默认方法,它也将是无用的,因为将始终使用Object类方法.这就是为什么要避免混淆,我们不能有重写Object类方法的默认方法.

我很快尝试使用代码来确认行为

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印

DefaultMethodClass.defaultMethod()
Run Code Online (Sandbox Code Playgroud)

我无法看到为什么语言设计师选择这种特定行为背后的任何具体原因.他们的任何重要原因是我失踪了吗?或者它只是接口默认方法在逻辑上比超类提供的具体实现重要性低?

Pet*_*rey 5

我无法看到为什么语言设计师选择这种特定行为背后的任何具体原因.

方法定义在Java 1.0中,接口默认方法在Java 8中添加.为Java 1.0编写的代码仍然需要工作.

或者它只是接口默认方法在逻辑上比超类提供的具体实现重要性低?

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

  • 即使没有向Java 8之前的代码的向后兼容性,当将`default`方法添加到接口时,允许`default`方法覆盖现有方法可能会导致现有代码的令人惊讶的行为. (5认同)

Jac*_*ack 5

答案很简单:你可以实现多个,interface但你可以扩展一个class.实际上,default通过实现多个接口,您不能拥有多个具有相同名称的方法.

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

作为个人观点:默认方法被视为"当没有定义时的功能的实现",如果该方法在实际类中定义,则期望它是更具体的实现.