实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]

Posted

技术标签:

【中文标题】实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]【英文标题】:Real world examples when to use Abstract class and when to use Java 8 introduced interface(default and static methods) [duplicate] 【发布时间】:2018-08-27 00:01:04 【问题描述】:

在 Java 8 之前,我知道何时使用抽象类和接口,但在 Java 8 引入默认和静态方法之后,可以在接口中提供。 接口和抽象类几乎相似,只是您可以在抽象类中创建构造函数,而不能在接口中执行此操作。 除此之外,我想知道在实际示例中何时使用抽象类以及何时使用 Java 8 接口。

【问题讨论】:

这个(使用抽象类与接口)在引入 Java 8 后不应该改变 接口方法只适用于不需要直接访问实例私有状态的方法。如果您了解接口方法和抽象类中的方法之间的区别,您就会知道何时可以使用其中之一(或两者)。然后由您决定更喜欢使用哪个。 ***.com/questions/19998454/… 【参考方案1】:

通过在接口中引入默认方法,Java 8 可能在某些情况下无需引入中间抽象/基类,该类实现具有任何子类默认行为的接口。 有时,由于其他原因(遗留,需要包含字段等等),仍然需要抽象/基类,但它的子类仍然可以从默认实现中受益,而无需定义它。

因此,Java 8 之前在基类中定义的默认实现现在可以直接在接口中定义为默认方法。

Collection 接口中定义的stream() 方法就是一个很好的例子。 AbstractCollection 及其子类ArrayList 不需要定义它。直接继承自接口。

【讨论】:

是的,stream() 方法就是一个很好的例子,你能推荐更多这样的例子吗? @RameshFadatare List#replaceAllList#sortMap#getOrDefault 等 - 有很多。【参考方案2】:

如果您需要java中的多重继承,您必须使用接口而不是抽象类。

【讨论】:

以上是关于实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Dart 中何时使用 mixins 以及何时使用接口?

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

何时使用接口或抽象类?何时使用两者?

Java中的异常处理:何时抛出异常,何时捕获异常?

何时使用工厂方法模式?

什么是Mixin以及何时在聚合物中使用它?