何时使用:Java 8+ 接口默认方法与抽象方法

Java 8 允许在称为“默认方法”的接口中默认实现方法

我感到困惑的是,我什么时候会使用那种,而不是(with )。interface default methodabstract classabstract method(s)

那么,何时应该使用与默认方法的接口,何时应该使用抽象类(带有抽象方法)?抽象类在这种情况下是否仍然有用?


答案 1

抽象类比默认方法实现(如私有状态)要多得多,但从Java 8开始,只要你可以选择其中任何一个,你应该在接口中使用defender(又名)方法。default

对默认方法的约束是,它只能在调用其他接口方法时实现,而不引用特定实现的状态。因此,主要用例是更高层次和便利的方法。

这个新功能的好处是,以前你被迫使用抽象类来方便方法,从而将实现者限制为单个继承,现在你可以有一个非常干净的设计,只需要接口和最少的实现工作强加给程序员。

将方法引入 Java 8 的最初动机是希望使用面向 lambda 的方法扩展 Collections Framework 接口,而不会破坏任何现有的实现。虽然这与公共库的作者更相关,但您可能会发现相同的功能在您的项目中也很有用。您有一个集中的地方,可以添加新的便利性,而不必依赖类型层次结构的其余部分的外观。default


答案 2

存在一些技术差异。与 Java 8 接口相比,抽象类仍然可以做更多的事情:

  1. 抽象类可以有一个构造函数。
  2. 抽象类更具结构化,可以保持状态。

从概念上讲,防御者方法的主要目的是在Java 8中引入新功能(作为lambda函数)后向后兼容。