【问题标题】:Why is List not simply defined as an abstract class rather than being an interface?为什么 List 不简单地定义为抽象类而不是接口?
【发布时间】:2012-08-08 05:46:18
【问题描述】:

我们有类似的东西

List lst = new LinkedList();

这表明 List 是某种类。那么,为什么称它为接口呢?我们可以简单地称它为实现 Collection 的抽象类。

【问题讨论】:

  • 我不应该通过揭示 List 是一个接口的事实来得到一个负面的观点......此外,问题不在于何时使用抽象类或接口......它是否list 是一个抽象类或接口

标签: java collections interface


【解决方案1】:

接口和抽象类用于不同的目的。见this question

列表定义了我们希望列表类型对象具有的一组行为,而不是数据结构层次结构的基础。它不需要指定任何共享行为或类似的东西。它只是简单地说“所有想要自称为 List 的东西都应该能够做这些事情”

【讨论】:

    【解决方案2】:

    如果一个类已经在扩展另一个类,在你的情况下它不能扩展 List。

    基本上你必须了解difference between abstract class and interface

    或者您可以阅读Effective Java 中的第 18 项以获得更好的理解。

    【讨论】:

      【解决方案3】:

      List lst = new LinkedList();

      这里的列表是一个单一类型的集合,其属性不同于其他集合类型。 LinkedList 是这些 List 属性的实现,使用自己的数据结构作为 LinkedList。 ArrayList 是另一种以自己的方式实现相同属性的数据结构。

      集合是 100% 抽象的。不同类型的集合具有不同的属性。 例如 列表 is A 集合,其属性为允许复制。秩序很重要。 ETC 将 is A 集合设置为不允许复制的属性。顺序可能不重要等等

      所以由于在不同的Collection类型中不需要共同的实现逻辑,所以不需要创建Abstract Class。

      还有 列表 lst = new LinkedList(); 提供了运行时多态性的一些好处。 您可以有一些将参数作为 List 的代码,例如进程(列表 lst)。 这里可以通过传递 LinkedList 或 ArrayList 等来使用相同的代码。 让我不要详细说明。

      通过 Oleksi 指定的接口和抽象类之间的区别。 此外,我想简化事情。 OOP中的主要概念是抽象,它是广义概念。人是动物。动物是生物。现在,Living Thing 是最高级别的抽象。 这里要说明的是,如果接口抽象是 100%。在抽象类的情况下,抽象可以在 0 到 100% 之间变化。

      通常,当需要默认提供某些功能时使用抽象类,而其余的依赖于要扩展它的类。例如 假设 Animal 是抽象类。每个动物都有共同的东西,比如 creatEnergy(),它有共同的东西,比如食物转化为蛋白质、脂肪等,这是很常见的。所以这个实现对所有动物都是一样的。 但是对于 Man、Bird、Fish 等动物,moving() 等其他内容可能会有所不同。因此,不同的动物可能实现它不同。因此这里的抽象从 0 到 100 % 不等。

      再次在Java中类只能扩展一个类,但实现不同的接口。 所以接口提供了一种方式,让类在不同的时间有接口提供的不同行为。

      希望这个解释能消除您的疑虑。如果需要更多解释,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-20
        • 2013-09-21
        • 2020-07-06
        • 2014-07-23
        • 2012-04-24
        • 2011-01-10
        • 1970-01-01
        • 2012-04-11
        相关资源
        最近更新 更多