Java的集合类方法的实现在哪里



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

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

契约,不是继承

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

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

所以接口没有继承。

你说:

,如List接口。因为add继承自接口

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

你问:

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

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

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

在IDE创建:

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

然后按住Ctrl键并将光标移动到方法"add"上并单击。你将在ArrayList中看到实现。否则,您可以右键单击界面列表中的方法添加->去→例如:ArrayList.

最新更新