【问题标题】:Where are the implementations of Java's Collection class methodsJava的Collection类方法的实现在哪里
【发布时间】:2021-04-24 02:21:07
【问题描述】:

在阅读了几本关于 Java 继承的书籍后,我仍然不清楚 Java 的接口是如何工作的。例如,Collection 接口包含许多方法,例如“add”,这些方法由其他接口(例如 List 接口)继承。由于 add 是从接口继承的,根据定义,Collection 接口只会为 add 提供方法签名。所以我的问题是 add 的具体实现在哪里定义(实际添加的代码?)

【问题讨论】:

  • 我仍然看不到 add 实现的来源。 Collection 和 List 是在 add 方法之外没有具体实现的接口
  • 查看the documentation of Collection 是一个简单的方法。查看public interface Collection<E> 定义正上方的所有已知的实现类: 部分?这些是add 方法的实现所在的位置。 (有些可能会从其他类继承 add 的实现,而不是提供自己的实现。)
  • 你从哪里得到那个类型的对象? new XYZ()?然后XYZ 提供实现。工厂方法?然后,查看工厂方法的代码。如果您跟踪足够长的时间,您将始终以 new SomeType(…) 表达式结束,而 SomeType 是实现类。

标签: java inheritance collections interface


【解决方案1】:

契约,而不是继承

Java 中的接口与代码无关,也与行为无关(我们将忽略此答案中的默认方法)。接口是简单且重要的合约。接口提出了一组方法签名。方法签名是方法的名称以及特定类型的参数和特定类型的返回值。

类的程序员决定她是否希望她的类承诺并履行该合同。她用implements 标记她的班级以做出承诺。她在该类中编写具有相同签名的方法来履行合同。编译器验证她的工作,确保接口中列出的每个方法签名实际上都在类中实现。

所以接口没有继承。

你说:

比如List接口。因为add是继承自一个接口

不,不涉及继承。 List 接口是一个约定,承诺每个实现类都将提供某些方法。其中一种方法是add。所有实现都必须有一个add 方法。所以ArrayList 有一个add 方法。而LinkedList 有一个add 方法。这两个具体的类都承诺履行List 接口中规定的合同。而且我们知道他们履行了该合同,否则这些类的源代码将永远无法成功编译。

你问:

add 的具体实现在哪里定义(实际添加的代码?)

实现接口的每个具体类都包含实现接口中定义的每个方法的实际代码。或者,具体类从其超类继承该代码。但是接口不包含任何代码(同样,让我们​​忽略默认方法),因此我们知道进行添加的代码不在接口中。

ArrayList 类通过在后台操作数组来实现add 方法。如果当前使用的数组有一个插槽打开,则将要添加的元素分配给该插槽。如果当前数组已满,则该类尝试将连续内存中的数组增加一些额外的插槽。如果成功,则将元素分配给这些添加的插槽中的第一个。如果没有足够的连续内存可用,则在内存的其他位置建立一个新的更大的数组,复制旧数组的内容,最后分配新元素,同时丢弃旧数组。 ArrayList 类中的所有这些代码。 LinkedList 类具有完全不同的方法来跟踪和添加元素。所以LinkedList 有一个完全不同的add 方法实现。

【讨论】:

    【解决方案2】:

    在 IDE 中创建:

     ArrayList list = new ArrayList();
     list.add("hello");
    

    然后按住 Ctrl 键并将光标移到方法“添加”上并单击。您将在 ArrayList 中看到实现。否则,您可以右键单击接口列表中的方法添加->转到->实现,然后选择例如数组列表。

    【讨论】:

      【解决方案3】:

      Collection 接口的任何具体实现都应该提供 add 方法的实现。例如 java.util.ArrayList 提供了 add 方法的实现。

      【讨论】:

      • List 是否继承自 ArrayList ?如果没有,Collection 和/或 List 是否需要为 List 定义 add 才能使用该方法?
      • ArrayList 实现 List,而不是相反。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 2011-11-03
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多