A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄连兵 中级黑马   /  2012-6-15 11:53  /  1789 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄连兵 于 2012-6-19 13:12 编辑

看到很多次这种写法:
private static List<String> list = new ArrayList<String>();
为什么不直接使用:
private static ArrayList<String> al = new ArrayList<String>();

7 个回复

倒序浏览
父类引用指向子类对象,这个是实现多态要素之一,多态后就可以写出一段所有子类都通用的代码,当添加新的子类时,这段代码是不需要修改的。
楼主可以看看下面的代码:
  1. package Test;

  2. public class Demo {
  3. public static void print(A a){
  4. //這裡寫的參數類型為A,所以你就可以傳任何實現了接口A的子類對象
  5. }
  6. }

  7. //接口A
  8. interface A{
  9. public String toString();
  10. }

  11. //A1實現接口A
  12. class A1 implements A{
  13. public String toString(){
  14. return "A1";
  15. }
  16. }
  17. //A2實現接口A
  18. class A2 implements A{
  19. public String toString(){
  20. return "A2";
  21. }
  22. }
复制代码
回复 使用道具 举报
ArrayList是List的一个子类,这里是毕老师在多态里面说过的:父类引用指向子类对象。
这样可以实现多态,增强了程序的可扩展性~
回复 使用道具 举报
这个张老师专门提到过的问题,在创建对象的时间,尽可能的创建父类对象,子类去进行实例化,eclipse上面也有提示,反正别人这么用肯定有他的道理,也不要硬要寻跟问底,记住就行,张老师也是这么说的,嘿嘿
回复 使用道具 举报
本帖最后由 李盼 于 2012-6-15 12:48 编辑

这就是父类引用指向子类对象,也就是多态三要素之一!
多态三要素即:1.要有继承关系。2.要有子类重写父类的方法。3.要有父类引用指向子类对象。

首先,我们要知道子类在调用构造方法时,都会先调用父类的构造方法创建一个父类的实例对象,就算我们没有写这段代码,系统也会默认一个super引用。所以,当一个子类被实例化对象时,在它之前已经存在了一个父类的实例化对象。而父类的引用实际上指向的就是这个子类实例中的父类实例对象。由此我们可知,这个引用只能调用子类继承的父类方法,而不能调用子类特有的方法,那么既然这样,大家为什么都还热衷于这么写呢?这不是明显的局限性吗?

   好处当然是有的,还是以 List<String> list = new ArrayList<String>();为例,我们知道,ArrayList具有对集合中的元素快速查找的特点,但是其增删速度较慢。如果后期我们发现增删速度太慢了,想改用增删速度快的LinkedList,那么我们只用修改这一句代码为List<String> list = new LinkedList<String>();而不用去修改后面大量用lis存取数据的代码,这就极大的提高了代码的扩展性,便于我们后期修改维护。

  我们在使用一个子类时,如果不需要调用子类特有的方法,我们尽量用父类引用指向子类对象的方式编写代码。
回复 使用道具 举报
List有很多子类,ArrayLIst就是其中之一,之所以写成
private static List<String> list = new ArrayList<String>();
是运用了多态的知识,父类引用指向子类对象,这样有利于以后程序的扩展
回复 使用道具 举报
柯玲 中级黑马 2012-6-15 12:50:59
7#
同意以上童鞋的观点,就是一个多态应用,便于程序的可读性和维护。
回复 使用道具 举报
这应该是为了更好的体现编程时候的面向接口的编程这一原则。
子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,   定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
例如:定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类 。我这样定义时:   Animal a = new Cat();假如以后要发生变化,比如把Cat换成Dog(),这样定义机会直接改就可以,但是如果定义成Cat a = new Cat();则需要改变很多代码才能完成修改维护的功能。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马