何时使用抽象类以及何时使用Java8引入的接口(默认和静态方法)的真实示例

何时使用抽象类以及何时使用Java8引入的接口(默认和静态方法)的真实示例,java,java-8,Java,Java 8,在Java8之前,我知道什么时候使用抽象类和接口,但在Java8引入默认和静态方法之后,可以在接口中提供这些方法。 接口和抽象类几乎是相似的,只是您可以在抽象类中创建构造函数,而不能在接口中创建构造函数。 除此之外,我想知道什么时候使用抽象类,什么时候在实际示例中使用Java 8接口。如果您需要Java中的多重继承,您必须使用接口而不是抽象类。通过在接口中引入默认方法,在某些情况下,Java 8可能不需要引入一个中间抽象/基类,该类使用任何子类的默认行为实现接口。 有时,由于其他原因(遗留、需要

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

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

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

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

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

这(使用抽象类vs接口)在引入Java 8后不应改变。接口方法仅在方法不需要直接访问实例的私有状态时适用。如果您了解接口方法和抽象类中的方法之间的区别,您将知道何时可以使用其中一种(或同时使用两者)。是的,stream()方法是一个很好的例子,你能推荐更多这样的例子吗?@rameshfadare
List#replaceAll
List#sort
Map#getOrDefault
,等等——它们有很多。