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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

高玉吉

初级黑马

  • 黑马币:0

  • 帖子:5

  • 精华:0

© 高玉吉 初级黑马   /  2013-10-28 13:46  /  1329 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如我想创建一个ArrayList对象,我可以List arr = new ArrayList();也可以ArrayList arr = new ArrayList();
这两种方式创建的arr对象有什么区别吗?

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
第一种是多态,父类引用指向了子类对象提高了程序的可扩展性,即可以运用父类功能又可以调用自己功能,第二种是建立本类对象的引用

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。
List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
何伟超 发表于 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 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
前者是多态的形式,后者是直接创建本类。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1

查看全部评分

回复 使用道具 举报
这是个多态应用,第一个arr,只能引用子类从父类中继承的属性,而不可以引用他的特有属性。 第二个arr,可以引用子类中的所有属性。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
List arr = new ArrayList();
如果你要是想用父类引用变量arr调用子类ArrayList的特有方法时,就必须强转,Arraylist al=(List)arr,这样才可以直接调用子类的特有方法
ArrayList arr = new ArrayList();
建立的是子类自己的应用变量,可以直接调用自己的方法,不需要强转

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马