以List 和 ArrayList来举例: 自己习惯定义变量时用:ArrayList list = new ArrayList(); 构造函数用:public List function(List list)
今天有人指出定义变量时用ArrayList list = new ArrayList();不是一种好习惯,
而应该使用:List list = new ArrayList(); 构造函数时声明部分用抽象类或者接口(即举例中的List),是便于使用多态的特性。为什么在实例化一个对象时也要用抽象类或者接口来声明呢? 问指出来的人,他也说不出个所以然来,仅仅只能说一直是这样用的,这样才是好习惯。但我没有想出这好在那儿,而且有弱化类型的倾向。本来我就想使用ArrayList的特性,使用List的话,系统还需要多一次操作(即向下转化)。 请明白的给解答下吧,谢了。
今天有人指出定义变量时用ArrayList list = new ArrayList();不是一种好习惯,
而应该使用:List list = new ArrayList(); 构造函数时声明部分用抽象类或者接口(即举例中的List),是便于使用多态的特性。为什么在实例化一个对象时也要用抽象类或者接口来声明呢? 问指出来的人,他也说不出个所以然来,仅仅只能说一直是这样用的,这样才是好习惯。但我没有想出这好在那儿,而且有弱化类型的倾向。本来我就想使用ArrayList的特性,使用List的话,系统还需要多一次操作(即向下转化)。 请明白的给解答下吧,谢了。
function(List list)
ArrayList list = new ArrayList();这样声明的list就不能传进去 这叫做面向接口编程
看了您就懂了
很简单 假设人家提供的方法为
function(List list)
ArrayList list = new ArrayList();这样声明的list就不能传进去 这叫做面向接口编程
不可能传不进去吧
[/Quote]你先测试一下就知道能不能传了,另外,我自己懒,List都不想用。。一般都是Collection
目前我也只能想到规范这个可能,不过上面有两位给出了东西,等看完后可能会有新的发现吧
如果某一天,你发现你需要一个双向遍历的功能。那你如何修改你的程序?可能还有其他的地方也用了ArrayList这样的类型定义。这样,每一处你都需要修改。
如果你这样定义:
List list = new ArrayList();
那你只需要将ArrayList改成LinkedList,就可以去做其他的工作了。
你先测试一下就知道能不能传了,另外,我自己懒,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并没有任何报错啊