第一种方法里,利用ArrayList所实现的接口List来声明一个对象
这样在以后在使用这个l1对象的时候,如果根据实际需要不再使用ArrayList,则可以随时替换为List接口的其他实现类(如LinkedList,vector等)而不影响程序的运行
第二种方法直接声明成ArrayList,这个对象就只能是arralist类型或其子类型,而不能替换成如vector等collection了,不利于程序的扩展和移植

解决方案 »

  1.   

    那假使这样
    public static void main() {
        List l = new Vector();
        l.addElement();
    }
    在这里我使用了Vector独有的addElement()这个方法,如果以后我将它替换为ArrayList的话,明显就编译不过了,还需要改代码,所以个人认为第一种写法是为了移植和扩展方便的话,理由不充分。ps: 比较喜欢楼上的名字。
      

  2.   

    interesting question. However, your following codes cannot be compiled.
    List l = new Vector();
    l.addElement(); //List has no addElement() method. Dynamic Lookup occurs in runtime, which means if your code is ok, Vector.addElement() will be called in runtime. But during compiling stage, l.addElement() is illegal.I partly agree ff123's words, while I don't think one is better than another.
      

  3.   

    考虑了系统的可移植,维护
    用了OO的三大特性之一:多态
    看看 TIJ
      

  4.   

    public static void main() {
        List l1 = new ArrayList();
        ArrayList l2 = new ArrayList();
    }
    这两种类型声明方式为什么第一种要比第二种好。第一种比第二种好吗?我怎么没看出来,只不过类ArrayList是接口List的实现罢了,
    我完全可以通过上溯造型把l2造型成List类型的再使用
    List l1 = new ArrayList();
    和ArrayList arrlist = new ArrayList();
    List l1=arrlist;在使用上有不同吗
      

  5.   

    第一种比第二种好。
    如 fft123(专杀各类日本畜生) 所说,
    如果ArrayList随时替换为List接口的其他实现类(如LinkedList等),使用接口List就不会影响程序的运行。也就是说List,ArrayList,LinkedList中都有的方法,通过动态调用就可以完成。
    当需要使用ArrayList类中的具体方法时(接口List中没有),可以使用强制类型转换,
    (ArrayList)l.xxx();(LinkedList)l.xxx();如不清楚,需要学习“多态”
      

  6.   

    对接口编程,以后改变起来方便,只是要List类型的都就可替换,客户端不用改代码
      

  7.   

    to:sandboy10000(sandboy10000) , wobelisk() 
    Vector里有addElement(Object o)相同的功能方法:add(Object obj).
    This method is identical in functionality to the add(Object) method (which is part of the List interface).
      

  8.   

    真的可以这样“多态”吗?各位
    如果没有理解错的话,这是我照各位的说法写的程序
    public static void main(String[] args) throws Exception {
        List l1 = new ArrayList();
        //ArrayList l2 = new ArrayList();
        Vector l3 = (Vector)l1;
    }
    编译是没有错误,可运行时
    java.lang.ClassCastException......l1最初造型是ArrayList,就不能强制转换了吧,以我愚见
      

  9.   

    fft123(专杀各类日本畜生)
    .....在以后在使用这个l1对象的时候,如果根据实际需要不再使用ArrayList,则可以随时替换为List接口的其他实现类..... sundaylihongbo(星期天) 
    如果ArrayList随时替换为List接口的其他实现类(如LinkedList等),这是你们自己的原话,并不是我要这样毫无关系的转换,我也不认为一个ArrayList可以随时替换为List接口的其他实现类
      

  10.   

    我同意fft123(专杀各类日本畜生)的说法,
    关于多态的问题大家可以去参考
    侯捷《深入潜出MFC》2e,第二章开始的部分,讲的挺明白,
    例子也很好,btw:本人颇为欣赏fft123(专杀各类日本畜生)兄的昵称!
      

  11.   

    转换是这样转的:
    public static void main(String[] args) throws Exception {
        List l1;
        //l1 = new ArrayList();
        l1 = new Vector();//l1对象是采用vector来实例化的    
    }
        如果l1已经用ArrayList实例化过,那么就不能再使用Vector来进行赋值
        这里的主要讨论的是l1这个对象,并且这个l1对象是提供给外界使用的,所以不必去关心l1对象的内部实现,也就是说我只要提供一个l1对象给你使用,这个对象具有List的一切特征,但这个对象是采用List的哪一个实现类来实现的,就不需要你外界来关心了
        ps:对这个问题还不清楚的,去看看工厂模式的介绍就知道了
      

  12.   

    to楼上的ruobo(我是一只小小鸟)和二楼的sandboy10000(sandboy10000)
    :)
    我的呢称是西大事件后改的,
    我帮你改一个昵称如何?
    (鸟嘴往日本鬼子的头上啄去)^_^
    二楼的英文的,不好改:(