黑马程序员技术交流社区

标题: 集合中想不明白的一个地方 [打印本页]

作者: 薄炳鑫    时间: 2012-6-17 19:17
标题: 集合中想不明白的一个地方
本帖最后由 薄炳鑫 于 2012-6-17 20:15 编辑

在定义一个集合的时候
List as = new ArrayList();
ArrayList as = new ArrayList();
这两个有什么区别,我见老师写的都是第一种,解释一下。

作者: 张_涛    时间: 2012-6-17 19:22
List as = new ArrayList();
ArrayList as = new ArrayList();
两种方式的区别:第一种属于面向接口的编程。
我们知道很多问题既可以用ArrayList()实现,也可以用LinkedList()实现。
当我们以后想要使用LinkedList()实现的时候,是不是第一种方式更容易修改呢?
虽然目前用不到,但是要考虑以后,编程很多时候都要这样考虑的,使代码的可复用性强,可修改性好。
作者: 陈嘉宾    时间: 2012-6-17 19:24
本帖最后由 陈嘉宾 于 2012-6-17 19:25 编辑

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。
List as = new ArrayList();这句创建了一个ArrayList的对象后上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList as=new ArrayList();创建一对象则保留了ArrayList的所有属性。

作者: 孙峰    时间: 2012-6-17 19:27
第一种写法 涉及到 多态。 一个父类的引用指向其子类的对象。这样做提高程序的扩展性,  这时如果想用ArrayList里特有 方法时 需要  类型转换: (ArrayList)as,

同时,要注意多态在 编译和运行时容易出现的问题。 老毕总结的是 编译看左边(父类),运行看右边(子类) ,
如果是成员变量 或者静态成员函数,则都参考父类,   具有时才能编译或运行通过

作者: 朝哥    时间: 2012-6-17 19:29
第一句是父类引用指向子类对象
第二句是本类引用指向本类对象
估计lz还没学到多态吧?
不懂不要紧,等学了多态你就明白了。
先记着。
作者: 孙飞    时间: 2012-6-17 19:36
第一种写法是很好的面向接口编程的习惯。
比如你有这么一个方法供别人调用:
public List getXXXList(){
    List list = new ArrayList();
    ...
    return list;
}
现在是new ArrayList(),如果万一以后要改成new LinkedList()的话,你这个方法的返回类型就不需要改了,并且调用这个方法的所有类都不需要修改,这样就降低了修改程序的成本和风险,提高了程序的可复用性。这就是面向接口编程的好处。

java的多态,List只是定义了一堆接口,而对于这些接口,有各种各样的实现,比如ArrayList,LinkedList等等,不同的实现,会有自己不同的特性以及追加自己特有的方法。当你仅仅使用List的通用接口方法时,定义成List(也就是面向接口编程)是非常好的习惯,如上所说。但是,当你在某个地方想用ArrayList的某个特有的方法的时候,如果定义成List的话,就需要转型成为ArrayList之后才能使用,这时候,如果定义成ArrayList的话,就少了转型这一步。
如果你是写共通类共通方法的话,建议少用特性,多面向接口。
作者: 余银桂    时间: 2012-6-17 19:36
List是接口,ArrayList是实现
第一种定义,是很好的面向接口编程的习惯。
java的多态,List只是定义了一堆接口,而对于这些接口,有各种各样的实现,比如ArrayList,LinkedList等等,不同的实现,会有自己不同的特性以及追加自己特有的方法。当你仅仅使用List的通用接口方法时,定义成List(也就是面向接口编程)是非常好的习惯,如上所说。但是,当你在某个地方想用ArrayList的某个特有的方法的时候,如果定义成List的话,就需要转型成为ArrayList之后才能使用,这时候,如果定义成ArrayList的话,就少了转型这一步。
作者: 薄炳鑫    时间: 2012-6-17 20:17
feigecal 发表于 2012-6-17 19:36
第一种写法是很好的面向接口编程的习惯。
比如你有这么一个方法供别人调用:
public List getXXXList(){

谢谢,明白点啦。。。
作者: 孙飞    时间: 2012-6-18 06:58
薄炳鑫 发表于 2012-6-17 20:17
谢谢,明白点啦。。。

不客气,共同进步,呵呵
作者: 王璐    时间: 2012-6-18 08:08
List和ListArray的区别是:
List是一个接口,而ListArray是一个类;
ListArray继承并实现了List;
所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list;     //正确   list=null;
List list=new List();    //   是错误的用法


List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
这是一个例子:
import java.util.*;

public class TestList{
public static void main(String[] args){
List list = new ArrayList();
ArrayList arrayList = new ArrayList();

list.trimToSize(); //错误,没有该方法。
arrayList.trimToSize();   //ArrayList里有该方法。
}
}

编译一下就知道结果了。

如果这个样子:
List a=new ArrayList();
则a拥有List与ArrayList的所有属性和方法,不会减少
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2