List a = new ArrayList();
ArrayList a = new ArrayList();
Collection a = new ArrayList();
上述三种建集合对象的方式有何区别?作者: 黑马张旭明 时间: 2012-8-30 11:30
Collection是List的父类,List是ArrayList的父类,这就是多态了。
List a = new ArrayList();
父类引用指向子类对象,a只能使用List中有的方法,而ArrayList()的特有方法不能使用。
ArrayList a = new ArrayList();
这个就不是多态了,中规中矩的建立对象,可以使用a自身所有的方法。
Collection a = new ArrayList();
和第一个一样父类的引用指向子类的对象,a只能使用Collection中的方法,ArrayList特有的方法或者从List处覆写的特有方法(如List特有迭代器ListIterator)不能使用。
具体有哪些特有方法可以查阅API文档。 作者: 刘佳 时间: 2012-8-30 11:37
黑马张旭明 发表于 2012-8-30 11:30
Collection是List的父类,List是ArrayList的父类,这就是多态了。
List a = new ArrayList();
父类引用指向 ...
一般用哪种方式比较好?作者: 高廷平 时间: 2012-8-30 11:43
首先说一下ArrayList List Collection 三者的关系:
ArrayList是List的实现类,List又是Collection的子类型
List a = new ArrayList();//父类应用指向子类对象
ArrayList a = new ArrayList();//只是ArrayList类的实例化
Collection a = new ArrayList();//父类的父类应用指向子类对象
其实上述语句中:
List a = new ArrayList();
Collection a = new ArrayList();
就是所谓的“多态”。作者: 张飞年 时间: 2012-8-30 11:45
首先要明确Collection与List都是接口,List是Collection的子接口,而ArrayList是List的实现类,也就是Collection的实现类。List a = new ArrayList();表示生成a引用指向ArrayList()对象,子类指向父类引用,所以可以使用LIst接口里列出的方法,而不能使用ArrayList私有的方法。Collection a = new ArrayList()也是一样的道理。ArrayList a = new ArrayList()中的就是本类实例化,和一般的类的用法一样的。不知道这么说你明白 吗?作者: 黑马张旭明 时间: 2012-8-30 12:01
刘佳 发表于 2012-8-30 11:37
一般用哪种方式比较好?
看情况而定吧,要用这个类中独有的方法当然是ArrayList a= new ArrayList()这种方式好。当定义一个方法method (参数),里面的参数如果是ArrayList a 的话那就只能传ArrayList类型的,如果定义的是List a的话就能传LinkedList和ArrayList类型的,可以说增加了扩展性。还有匿名子类对象等都用到了多态。作者: 陈莹 时间: 2012-8-30 12:18
这是多态,你可以类比来考虑这个问题,Collection就是爷爷,List就是爸爸,ArrayList就是儿子。在你的这三个例子中,不存在List和Collection的转换,所以,你把Collection和List都当做ArrayList的父类来考虑就行。
List a = new ArrayList();
ArrayList a = new ArrayList();
Collection a = new ArrayList();
这是向上转型,也就是说子类转换成父类对象(父类不能转换成子类),利用动态绑定技术,可以在运行的时候根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。
多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。从程序设计的角度而言,例如:
public interface Parent(){
public void show();
}
public class Child_1 implements Parent{
public void show(){
……
}
}
public class Child_2 implements Parent{
public void showl(){
……
}
}
Parent pa = new Child_1();
pa.show()则显然是调用Child_1的方法;
Parent pa = new Child_2();
pa.show()则是在调用Child_2的方法。所以,我们对于抽象的父类或者接口给出了我们的具体实现后,pa 可以完全不用管实现的细节,只访问我们定义的方法,就可以了。事实上,这就是多态所起的作用。也就是说,将子类类型的指针赋值给父类类型的指针,之后,父亲的行为像儿子,而不是儿子的行为像父亲。 作者: 赵伟闯 时间: 2012-8-30 17:10