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