在定义一个集合的时候
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()的话,你这个方法的返回类型就不需要改了,并且调用这个方法的所有类都不需要修改,这样就降低了修改程序的成本和风险,提高了程序的可复用性。这就是面向接口编程的好处。
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();