从 jdk-8 开始,Java 标准库中是否有抽象类与接口使用的示例?



例如,在java教程(https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html(中,AbstractMap类被用作抽象类的示例。既然 jdk8 现在接口方法可以是默认的或静态的,那么有什么理由(除了它已经存在并且以前有意义之外(AbstractMap 不可能是一个接口吗?据我了解,jdk8 之后的其余区别是:

抽象
  1. 类可用于抽象状态(不限于静态最终字段/并且可以具有构造函数(,而接口则不能。
  2. 可以实现多个接口(通过相关或不相关的类(,而只能扩展一个类。
  3. 接口的添加功能是为了保持向后兼容性。

看起来如果从头开始,在大多数情况下,界面将提供大致相同的功能,并且决定使用哪个归结为第 1 点和第 2 点,而不管 3 是扩展界面功能的原因。

我错过了什么吗?是否有任何在 jdk8 上或之后创建的标准库类示例来举例说明这些差异?我正在学习,所以如果我忽略了什么,请原谅我。

列表中缺少一点是protected方法。一个接口只能有公共接口。因此,如果你有一个模板方法模式,你希望子类实现一些东西,但不将其公开为公共 API,你就不能用接口做到这一点。

一个例子可能是AbstractList#removeRange(int, int).也是列表中排名第 1 的示例(具有受保护的字段(。

现在,关于为什么AbstractMap不是新API中的接口,我不能代表JDK开发人员。一件事是java.util集合共享类似的设计,更改一个但不更改其他集合会破坏一致性。一些向后兼容性也是如此。即使就我个人而言,我可能不会依赖于某些东西是一个类而不是一个接口的事实。

最新更新