以List 和 ArrayList来举例:  自己习惯定义变量时用:ArrayList list = new ArrayList();  构造函数用:public List function(List list)
    今天有人指出定义变量时用ArrayList list = new ArrayList();不是一种好习惯,
而应该使用:List list = new ArrayList();  构造函数时声明部分用抽象类或者接口(即举例中的List),是便于使用多态的特性。为什么在实例化一个对象时也要用抽象类或者接口来声明呢?  问指出来的人,他也说不出个所以然来,仅仅只能说一直是这样用的,这样才是好习惯。但我没有想出这好在那儿,而且有弱化类型的倾向。本来我就想使用ArrayList的特性,使用List的话,系统还需要多一次操作(即向下转化)。  请明白的给解答下吧,谢了。

解决方案 »

  1.   

    这是面向接口编程的一个习惯。你针对的是真正的行为而非一个具体操作。但是今后JDK将会走低耦合的道路,以后的工具类会更像apache的类。
      

  2.   

    很简单 假设人家提供的方法为
    function(List list)
    ArrayList list = new ArrayList();这样声明的list就不能传进去 这叫做面向接口编程
      

  3.   

    请看head first的设计模式
    看了您就懂了
      

  4.   

    我觉得即使用ArrayList来做声明,一般情况下多态也没有任何问题不论对方方法的参数申明是Collection还是List,都可以正常使用想来想去,主要是为了规范吧。还有就是不DEBUG的话,可以隐藏一些内部的具体东西。
      

  5.   

    引用 2 楼 knightzhuwei 的回复:
    很简单 假设人家提供的方法为
    function(List list)
    ArrayList list = new ArrayList();这样声明的list就不能传进去 这叫做面向接口编程
    不可能传不进去吧
    [/Quote]你先测试一下就知道能不能传了,另外,我自己懒,List都不想用。。一般都是Collection
      

  6.   

    是Head First Design Patterns吗?谢谢,我找来看看
    目前我也只能想到规范这个可能,不过上面有两位给出了东西,等看完后可能会有新的发现吧
      

  7.   

    ArrayList list = new ArrayList(); 
    如果某一天,你发现你需要一个双向遍历的功能。那你如何修改你的程序?可能还有其他的地方也用了ArrayList这样的类型定义。这样,每一处你都需要修改。
    如果你这样定义:
    List list = new ArrayList(); 
    那你只需要将ArrayList改成LinkedList,就可以去做其他的工作了。
      

  8.   


     你先测试一下就知道能不能传了,另外,我自己懒,List都不想用。。一般都是Collection
    [/Quote]
    import java.util.ArrayList;
    import java.util.List;
    public class Test { public static void main(String[] args) {
    ArrayList list = new ArrayList();
    new Test().f(list);

    }

    public void f(List list) {
    System.out.println("pass");
    }}这是测试代码控制台成功输出:pass并没有任何报错啊