黑马程序员技术交流社区

标题: 继承中的一个问题 [打印本页]

作者: 高玉吉    时间: 2013-10-28 13:46
标题: 继承中的一个问题
比如我想创建一个ArrayList对象,我可以List arr = new ArrayList();也可以ArrayList arr = new ArrayList();
这两种方式创建的arr对象有什么区别吗?

作者: 未知数|X|    时间: 2013-10-28 13:54
第一种是多态,父类引用指向了子类对象提高了程序的可扩展性,即可以运用父类功能又可以调用自己功能,第二种是建立本类对象的引用
作者: 何伟超    时间: 2013-10-28 13:56
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
作者: 高玉吉    时间: 2013-10-28 14:13
何伟超 发表于 2013-10-28 13:56
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面 ...

也就是说List list创建的list对象只有List接口所提供的功能而没用ArrayList除接口外的额外功能吗?
那如果这样呢,假如List跟ArrayList是父子类关系,用List list = new ArrayList()方式创建的就是一个父类对象?
我原来一直以为的是new ArrayList()代码创建了一个ArrayList对象,而前面的变量里面存的只是这个新对象的地址,指向了这个对象,所以他们在本质上是相同的

作者: 王飚    时间: 2013-10-28 23:05
楼上的朋友都已经说得很明确了,前者是多态的方式,后者是直接创建子类对象;
作者: cuilitang    时间: 2013-10-29 11:17
何伟超 发表于 2013-10-28 13:56
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面 ...
  1. package itcast.cn;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.ListIterator;

  5. public class ListDemo {
  6.         public static void main(String[] args) {
  7.                
  8.                 List<String> al = new ArrayList<String>();
  9.                 al.add("you ");
  10.                 al.add("and ");
  11.                 al.add("me");
  12.                
  13.                 ((ArrayList<String>) al).trimToSize();   //必须强转
  14.                
  15.                 //经验证,你说的是对的.
  16.                
  17.         }
  18.        
  19. }
复制代码

作者: 硬件之家    时间: 2013-11-1 15:34
前者是多态的形式,后者是直接创建本类。
作者: 回天之力    时间: 2013-11-3 08:18
这是个多态应用,第一个arr,只能引用子类从父类中继承的属性,而不可以引用他的特有属性。 第二个arr,可以引用子类中的所有属性。
作者: 编程的梦想    时间: 2013-11-3 09:12
List arr = new ArrayList();
如果你要是想用父类引用变量arr调用子类ArrayList的特有方法时,就必须强转,Arraylist al=(List)arr,这样才可以直接调用子类的特有方法
ArrayList arr = new ArrayList();
建立的是子类自己的应用变量,可以直接调用自己的方法,不需要强转




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2