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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

最近正在都《疯狂java》,集合这边发现作者总是会这么写 List a = new ArrayList();
为什么不写成 ArrayList a = new ArrayList(); 呢?
这样写有什么优点吗?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
这是多态...
父类可以用来创建子类对象.
ArrayList a = new ArrayList();
List a = new ArrayList();
这两句是一样的,都是在内存中创建了一个叫 a 的ArrayList对象
回复 使用道具 举报
{:soso_e122:}一样的
回复 使用道具 举报
看看多态。。。
回复 使用道具 举报
List和ArrayList的区别
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。
所以List不能被构造,但可以为List创建一个引用,而ListArray就可以被构造。
List list = new ArrayList();这句创建了一个ArrayList的对象
此时它也是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。
而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。

为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,
如 LinkedList或者Vector等等,这时你只要改变这一行就行了:
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList alist = new ArrayList(), 那么你需要改的地方就很多了,特别是如果你使用了 ArrayList特有的方法和属性。

点评

解释的很好,学习了  发表于 2012-7-18 12:38

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄昆 发表于 2012-7-18 00:12
List和ArrayList的区别
List是一个接口,而ListArray是一个类。
ListArray继承并实现了List。

同样的一个知识点,不同理解层次的同学会有不同的回答。如果深入的探究的话,我感觉每一个小的知识点都不简单,因为这考验的是一个人的知识体系。我总是惶恐的发现自己的整个体系漏洞百出,不堪一击。
回复 使用道具 举报
黄昆 中级黑马 2012-7-18 00:44:26
7#
黑马王冬冬 发表于 2012-7-18 00:42
同样的一个知识点,不同理解层次的同学会有不同的回答。如果深入的探究的话,我感觉每一个小的知识点都不 ...

慢慢来,知识都是积累出来的!哥们加油!
回复 使用道具 举报
①这叫面向接口编程,是java中非常重要的一种编程技巧;
②比如说这个题,当你想换成LinkedList,你用面向接口编程只需将
  List a=new ArrayList(); 改成 List a=new LinkedList);
其它任何引用到a的地方都不用改的。
③当你使用ArrayList a=new ArrayList(); ,换成LinkedList a=new LinkedList();时,
其它涉及到a的地方,都需要改,因为LinkedList不是ArrayList
4、ArrayList和LinkedList都是List,就像货车和轿车都是汽车一样,
   你以汽车(父类)为研究对象,就更抽象些,包容的东西就更多一些,如果你以奥迪a8为研究对象,就具体了,包容范围就少了。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
List是接口,ArrayList是JDK里提供的一个实现类。

List<String> list = new ArrayList<String>();

编译时类型是List,运行时类型是ArrayList,而List接口的实现类不只有ArrayList一个,用一个List类型的引用这是“面向接口编程”,好处有很多,但是尽量面向接口编程,这里只说一个这样写的好处:

以后我们会用到很多不是我们写的类,我们叫第三方类库,在类库里面很可能会返回一个这样的列表,但是他未必会返给你一个ArrayList,没准是人家自己写的一个实现类都说不准,那么我们面向接口编程,不需要了解是什么实现类,我们都把它们当List接收过来就好了,我们就当成List来用。提高程序的透明性,让底层的实现对上层使用者封装。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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