我研究了多态性并了解它可以进行动态方法绑定,如下所示。
假设 Animal 类是抽象类。
public class AnimalReference
{
public static void main(String args[])
Animal ref // set up var for an Animal
Cow aCow = new Cow("Bossy"); // makes specific objects
Dog aDog = new Dog("Rover");
// now reference each as an Animal
ref = aCow; ref.speak();
ref = aDog; ref.speak();
}
我曾经创建 ArrayList 的实例,例如:
ArrayList myList = new ArrayList();
但通常我认为人们会写:
Collection myList = new ArrayList();
所以我的困惑是声明为 Collection 有什么好处?我也不知道你可以在“myList”前面添加“Collection”(这是一个接口而不是抽象类)。
为什么仅仅说以下内容不是一个好习惯:
ArrayList myList = new ArrayList();
我阅读了 Collection 接口和 ArrayList Java 文档以及在线教程,但仍然不太清楚。
有人能给我一些解释吗?
如果你声明myList
as ArrayList
,你修复它的具体类型。每个使用它的人都将依赖于这个具体类型,并且很容易(甚至是无意中)调用特定于的方法ArrayList
。如果稍后您决定将其更改为例如LinkedList http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html or CopyOnWriteArrayList http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.html,您需要重新编译 - 甚至可能更改 - 客户端代码。接口编程消除了这种风险。
请注意,之间Collection
and ArrayList
,还有另一个抽象层次:List http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html界面。通常,列表的使用模式与映射、集合或队列的使用模式非常不同。因此,您的工作所需的集合类型通常是早期决定的,并且不会改变。将您的变量声明为List
明确这一决定,并向客户提供有关该收藏所遵守的合同的有用信息。Collection
OTOH 通常除了迭代其元素之外没有多大用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)