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

Java 8--与抽象类的默认方法接口

谢英光
2023-03-14

我想给出一个完整的答案:

“为什么/何时使用抽象类而不是接口。”

并寻求对以下方面的验证/建议。

“一个原因是:接口方法都是公共的,字段成员都是常量(final和public)。您可能需要限制方法的访问权限和/或使它们在非常量状态下操作。

另一个是:子代类可以通过super调用抽象类方法,而它不能对默认接口方法调用抽象类方法。此外,接口没有可由后代调用的构造函数。

其余的原因与上面的pre-Java8中的原因相同。“

共有1个答案

梁池暝
2023-03-14

下面是选择抽象类而不是接口的一些原因。您列出的那些--私有字段等等,是一些主要的字段。这些是一些更微妙的

  • 类型清晰度。只能扩展一个类。这使得你的对象是什么以及如何使用它变得更清楚。
  • 钻石问题。您必须在接口中实现所有默认方法,以帮助避免菱形问题。如果接口是集合,这可能是一个巨大的痛苦,因为有十亿个集合。对于抽象类,只需覆盖
  • 所需的内容
  • 在Java8中,有lambda表达式,并且使用要实现的方法传递接口的旧例程已经被篡夺。但是,当您看到一个带有默认方法的接口时,它可以以您可能不想要的方式解释

以下是Oracle对这个问题的看法:

    null

编辑以澄清“钻石问题”子弹问题描述在这里(和许多其他地方)http://www.lambdafaq.org/what-about-the-diamond-problem/

当您从声明相同方法的两个地方继承,并且在解析函数调用时必须选择一个时,就会发生问题。这在Java7中从来不是一个问题,因为您只能扩展一个类,接口没有方法

现在的解析策略有点复杂,但这里有一个很好的描述:(来自http://blog.loxal.net/2013/05/java-8-default-interface.html)

 类似资料:
  • 我试图给出一个完整的答案: "为什么/何时使用抽象类而不是接口。" 并寻找以下方面的验证/建议。 对此的一个答案是, 在具体类来定义特定类型之前,抽象类通常位于继承层次结构中接口的正下方(就像Java API中的许多示例一样),实现并固定接口定义的结构的一些公共方面。 使用抽象类的另一个很好的理由是类型之间有一个清晰的逻辑层次结构。抽象类具有组织层次结构的作用,同时通过作为抽象类而不是具体类,迫使

  • 问题内容: Java 8接口默认方法与抽象类中的非抽象方法-两者之间是否有任何区别(除了iface-类,可见性等不同) 默认方法不是Java的后退一步,是否违反Java多年来宣传的本质? 问题答案: 如果抽象子类的具体子类被super()覆盖,则抽象类中的非抽象方法将被调用。因此,存在多种可能性。如果不重写method,则将执行超类方法。如果我们在具体的子类方法中使用super(),则将执行被超类

  • Java 8接口默认方法与抽象类中的非抽象方法--两者之间有什么区别吗(除了iface-class、可见性等的区别之外) 默认方法是不是在Java中倒退了一步,意味着它违背了Java多年来宣传的本质?!

  • Java是否计划用代替?我找不到一个真实的案例来使用缺省方法而不是抽象?

  • 抽象方法和默认方法有什么区别? 在从“贵族”那里知道答案之前,我认为默认方法不同于defender方法,默认方法只不过是接口内部的抽象方法(没有关键字abstract)。这两个错误的观念导致这个愚蠢的问题被提出来。我从来不想问一个已经“问得很好,回答得很好”的问题来麻烦大家。 我想删除这个问题,但我没有,因为两个原因-1。stackoverflow阻止了我,2。贵族的回答是出神入化的。

  • 主要内容:1 Java8 默认方法的介绍,2 Java8 默认方法的案例1 Java8 默认方法的介绍 Java提供了一种在接口内部创建默认方法的功能。在接口内部定义并带有默认标记的方法称为默认方法。这些方法是非抽象方法。 2 Java8 默认方法的案例 在下面的示例中,Sayable是一个功能接口,其中包含默认值和抽象方法。默认方法的概念用于定义具有默认实现的方法。您还可以覆盖默认方法,以为该方法提供更具体的实现。 输出结果为: