多态通话

时间:2010-03-16 03:00:51

标签: java oop polymorphism

我是java的新手,我已经在许多我老年人声称为

的地方的代码中看到过

List myList = new ArrayList();(选项1)

而不是

ArrayList myList = new ArrayList();(选项2)

您能告诉我为什么人们使用Option1,有什么优势吗?

如果我们使用option2,我们是否会错过任何优势或功能?

2 个答案:

答案 0 :(得分:10)

选项1被认为是对接口的编程,其中选项2是对实现的编程。后者有时是必要的,但前者使您能够通过确保不依赖于特定实现提供的方法来轻松切换实现。

此外,如果您创建的方法只需要接口提供的功能,那么它们应该被声明为需要接口,以便可以将实现接口的任何对象传递给它们。这样做可以扩大API的重用范围。例如:

// This can be called passing any List
public int countItems(List lst, Filter flt) {
    // iterate list, apply filter, and count matching objects
    }

// This can called passing only an ArrayList, an unnecessary limitation in this case
public int countItems(ArrayList lst, Filter flt) {
    // iterate list, apply filter, and count matching objects
    }

也就是说,对于某些接口,存在隐藏的实现依赖陷阱(至少在Java中)。 List.get(int)中的一个例子;如果您有ArrayList这是有效的,但对于LinkedList则不然。如果列表非常大,那么差异可能是戏剧性的,尤其是像这个循环一样构思不佳的构造:

for(int xa=0,len=list.length; xa<len; xa++) {
    Object obj=list.get(xa);
    obj.doSomething();
    }

对于大型链接列表具有可怕的性能,因为必须从每个get(xa)开始遍历列表。

答案 1 :(得分:3)

使用option1的优点,即List myList = new ArrayList();,就方法而言具有多态行为。比如说,你可以有一个方法,它接受类型为List的参数,

someMethod(List lst)
{
   lst.doSomething();
   //do somethng else.....
}

在此方法中,lst可以是Linked ListArrayListCopyOnWriteArrayList类型。