日期:2014-05-20  浏览次数:20622 次

List <String > lst = new ArrayList() 与 ArrayList<String> lst = new ... 的区别?
我见到很多人这样写代码:
List <String > lst = new ArrayList();

为什么不直接写成以下:
ArrayList<String> lst = new ArrayList();

这两种写法实际上有区别吗?? 






------解决方案--------------------
List是接口,ArrayList是JDK里提供的一个实现类。

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

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

以后我们会用到很多不是我们写的类,我们叫第三方类库,在类库里面很可能会返回一个这样的列表,但是他未必会返给你一个ArrayList,没准是人家自己写的一个实现类都说不准,那么我们面向接口编程,不需要了解是什么实现类,我们都把它们当List接收过来就好了,我们就当成List来用。提高程序的透明性,让底层的实现对上层使用者封装。
------解决方案--------------------
对底层来说,这种转换的时间几乎可以忽略不计,这个是实现多态的基础,
如果了解工厂方法设计模式,只有这样才能达到要求,这种做法也是面向对
象程序设计三大特性之一——多态。如果我哪天不用 ArrayList 了,要用
其他的 LinkedList 了,这样我只要在变量声明部分修改就可以了,下面
的代码可以一行不动。

实际上这样做,在 Java 中还有很多,像 JDBC 中的 Connection、
PreparedStatment、ResultSet 等等,这些都是接口,如果不去研究 JDBC
驱动提供的源代码,根本就不会知道其具体的实现类是哪一个,对于开发人员
来说,只要知道这些接口中的方法,以及该如何使用这些方法就足够了,不需
要去考虑底层的实现,正因为如此,换一种数据库只要更改其连接驱动和连接
字符串就够了,其他的根本用不着改。

当然了,如果要使用某个类中的独有的方法,那只能使用第二种写法了。