当前位置: 首页 > 知识库问答 >
问题:

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

卓云
2023-03-14

我在阅读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()

我看不出语言设计者选择这种特定行为的任何具体原因。他们有什么重要的原因让我失踪吗?或者仅仅是接口默认方法在逻辑上比超级类提供的具体实现更不重要?

共有2个答案

冯胤
2023-03-14

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

如果在任何情况下,默认方法的优先级高于在层次结构中的真实类中实现的方法,那么您最终会遇到Java设计者不想要多重继承的相同问题:歧义。

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

越霖
2023-03-14

我看不出语言设计者选择这种特定行为的任何具体原因。

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

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

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

 类似资料:
  • 我有一个带有注释方法的接口。注释用标记,所以我希望实现者继承它。然而事实并非如此: 所以问题是,为什么没有,尽管它实现了一个标记为的方法,即?

  • 问题内容: 假设有以下几种类型: 在这种情况下,如果执行,将打印“ hi from foo”。为什么的实现优先?不继承自,因为如果只实现,则将调用实现?因此,仍然不编译代码是有意义的。另外,由于应该具有的实现,为什么我不能像这样重写它: 尝试这样做时会发生以下错误: 错误的类型限定符Bar在默认的超级调用方法中,sayHi()在Foo中被覆盖 问题答案: 在JLS 9.4.1中 几乎使用您的确切示

  • 本文向大家介绍PHP接口多继承及tarits实现多继承效果的方法,包括了PHP接口多继承及tarits实现多继承效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP接口多继承及tarits实现多继承效果的方法。分享给大家供大家参考,具体如下: 接口多继承 在PHP的面向对象中,接口可以继承接口。PHP类只能继承一个父类(单继承),但是接口可以实现多继承,可以继承一个或者多个接口

  • 本文向大家介绍PHP接口继承及接口多继承原理与实现方法详解,包括了PHP接口继承及接口多继承原理与实现方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP接口继承及接口多继承原理与实现方法。分享给大家供大家参考,具体如下: 在PHP的接口中,接口可以继承接口。虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口。当然接口的继承也是

  • 我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出 接口中的静态方法从不继承。 然而,

  • 我对EasyMock(3.1)类的模拟有些困难。这应该适用于模拟部分类实现,我认为,这对于单元测试抽象基类,同时模拟缺少的方法是非常理想的。这是一个模式-一个立即识别的经典... 现在的测试是: EasyMock似乎不喜欢这样。它抛出: 有什么想法吗?我发现了一个相关的问题,但它并不是真正公正的标题。