例如,在java教程(https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html(中,AbstractMap类被用作抽象类的示例。既然 jdk8 现在接口方法可以是默认的或静态的,那么有什么理由(除了它已经存在并且以前有意义之外(AbstractMap 不可能是一个接口吗?据我了解,jdk8 之后的其余区别是:
抽象- 类可用于抽象状态(不限于静态最终字段/并且可以具有构造函数(,而接口则不能。
- 可以实现多个接口(通过相关或不相关的类(,而只能扩展一个类。
- 接口的添加功能是为了保持向后兼容性。
看起来如果从头开始,在大多数情况下,界面将提供大致相同的功能,并且决定使用哪个归结为第 1 点和第 2 点,而不管 3 是扩展界面功能的原因。
我错过了什么吗?是否有任何在 jdk8 上或之后创建的标准库类示例来举例说明这些差异?我正在学习,所以如果我忽略了什么,请原谅我。
列表中缺少一点是protected
方法。一个接口只能有公共接口。因此,如果你有一个模板方法模式,你希望子类实现一些东西,但不将其公开为公共 API,你就不能用接口做到这一点。
一个例子可能是AbstractList#removeRange(int, int)
.也是列表中排名第 1 的示例(具有受保护的字段(。
现在,关于为什么AbstractMap
不是新API中的接口,我不能代表JDK开发人员。一件事是java.util
集合共享类似的设计,更改一个但不更改其他集合会破坏一致性。一些向后兼容性也是如此。即使就我个人而言,我可能不会依赖于某些东西是一个类而不是一个接口的事实。