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

Java8之后什么时候使用接口与抽象类

林劲
2023-03-14

如果有人能给出我在Java15中需要在接口类和抽象类之间做出选择的1-2个场景示例,我将非常感激。此外,如果它能在现实生活中的项目,而不是动物或形状类的例子,将是伟大的。

谢谢!!

共有1个答案

方俊
2023-03-14

显然,您指的是在接口中实现行为的“默认方法”特性。

您应该明白,添加该特性是为了解决这个难题:如何在不破坏实现这些接口的现有类的情况下,利用现有接口上的流和lambda追溯性地添加特性?

许多新方法被添加到这些接口中,比如在Java Collections框架中。向现有接口添加方法会自动中断实现该接口的所有缺少新需要的方法的类。能够提供一个后退,在现在需要但还不存在的地方给出一个实现,将解决这一困境。 违约方法就这样诞生了。

将默认方法添加到接口中的最接近的原因是支持接口演化

因此,将默认行为添加到接口中的特性本身并不意味着是一个新的主流特性。default的目的不是替换abstract

事实上,一些经验丰富的Java专家建议不要养成在接口上编写默认方法的习惯。他们建议忽略Java语言的这一特性。继续把接口看作是简单地定义一个契约,把抽象类看作是提供要在子类中完成的部分实现。

    null

至于在接口和抽象类之间进行选择:

  • 通常从接口开始。或者几个接口,如果您希望各种实现类混合各种契约(请参见mixin)。
    • 在添加default方法之前要三思。考虑您的情况是否符合上面讨论的Brian Goetz推荐的四种情况之一。
    • 或者,使用组合而不是继承(下面讨论)。

    •Java总是有多种类型的继承

    •这增加了行为的多重继承

    •但不是国家,因为大多数麻烦都来自国家

 类似资料:
  • 问题内容: 为什么要创建抽象或接口类,或者何时应使用抽象或接口类? 问题答案: 仅在声明类必须具有的方法和成员时,才使用接口。实现该接口的任何人都必须声明和实现该接口列出的方法。 如果你还想拥有默认实现,请使用抽象类。扩展抽象类的任何类都必须仅实现其抽象方法和成员,并且将具有抽象类其他方法的一些默认实现,你可以覆盖或不重写。 -编辑-忘了提,Earwicker提醒我 最后,你可以根据需要实现任意数

  • 问题内容: 我想知道何时应该使用接口。 让我们考虑以下内容: 和: 我可以轻松实现它们,它们具有相同的功能…但是我也可以向车辆类中添加一些变量,这些变量可能应该在车辆中使用(maxSpeed,carType …) 使用接口的原因是什么? 谢谢! 编辑: 我在另一个线程中找到了关于它的漂亮链接:http : //www.thecoldsun.com/en/content/01-2009/abstra

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

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗

  • 问题内容: 我不清楚两者之间的区别。 谢谢 问题答案: 它们非常相似,但是存在一些重要的技术差异: 抽象类允许您为某些方法提供默认的实现,但是接口不允许您提供任何实现。 您可以实现多个接口,但只能从一个抽象类继承。 这些差异影响应使用两种技术的方式: 您应该使用接口来 定义合同 。 抽象类对于 重用代码 很有 用 ……但是请注意,它不是重用代码的唯一方法。您还应该考虑其他方法,例如遏制。

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制