从 jdk-8 开始的 java 标准库中是不是有抽象类与接口使用的示例? [复制]

Posted

技术标签:

【中文标题】从 jdk-8 开始的 java 标准库中是不是有抽象类与接口使用的示例? [复制]【英文标题】:Are there any examples of abstract class vs interface use in the java standard libraries from jdk-8 on forward? [duplicate]从 jdk-8 开始的 java 标准库中是否有抽象类与接口使用的示例? [复制] 【发布时间】:2020-09-18 04:57:03 【问题描述】:

例如,在 java 教程 (https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) 中,AbstractMap 类用作抽象类的示例。由于 jdk8,接口方法现在可以是默认或静态的,是否有任何理由(除了它已经存在 并且以前有意义的事实)AbstractMap 不可能是一个接口?据我了解,jdk8 之后的其余差异是:

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

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

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

【问题讨论】:

应该有很多例子。不知道为什么你没有找到。 你能找到任何具有受保护方法的抽象类的例子吗?会不会是一个界面? @pafau k。我可能很困惑,但你不能吗?即使它是一个公共的默认接口方法,你也不需要实现来使用它吗?即使它说是公开的,这是否没有得到有效的保护?如果不是由技术上应该阻止公共范围的子类实例化,它应该是不可用的? 在答案中扩展了这个,评论有点太长了 【参考方案1】:

列表中缺少一点是protected 方法。一个接口只能有公共的。因此,如果您有一个模板方法模式,您希望子类在其中实现某些东西,但不将其公开为公共 API,那么您不能使用接口来实现。

例如AbstractList#removeRange(int, int)。也是您列表中第一名的示例(具有受保护的字段)。

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

【讨论】:

AbstractList 还强调了实现List 接口的某种方式,即首先提供随机访问列表,例如拥有抽象的get(int) 方法并提供迭代器实现解决在上面。相反,AbstractSequentialList 有一个抽象的listIterator(int) 方法,并提供了一个get(int) 方法解决它。由于接口应该在不强制特定实现的情况下提供契约(当有选择时),所以为特定实现量身定制的基本实现不应该作为default 方法提供。

以上是关于从 jdk-8 开始的 java 标准库中是不是有抽象类与接口使用的示例? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python的标准库中是不是有平衡二叉树的模块?

Nashorn——在JDK 8中融合Java与JavaScript之力--转

标准 C 库中是不是有 strchr() 的多字符版本?

Ruby 的标准库中是不是有优先级队列数据结构实现?

从0开始搭建基于Zookeeper的Spark集群

JDK1.8源码分析02之阅读源码顺序