转载自:https://www.cnblogs.com/aisiteru/articles/1151874.html
List是一个接口,而ArrayList是List接口的一个实现类。 ArrayList类继承并实现了List接口。
List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指
向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。
List list; //正确 list=null;
List list=new List(); // 是错误的用法
List list = new ArrayList();//正确 这句创建了一个ArrayList实现类的对象后把它上溯到了List接口。此时它就是一个List对
象了,它有些ArrayList类具有的,但是List接口没有的属性和方法,它就不能再用了。(可以调用List和ArrayList都有的方法和属性,属性调用的是接口的属性,方法调用的是自己实现的接口的方法)
ArrayList list=newArrayList();//正确 创建的对象则保留了ArrayList的所有属性和方法(包含实现了接口list的方法和list中没有的方法和属性)。
如果这个样子:
List a=new ArrayList();
则a拥有List与ArrayList的所有属性和方法,不会减少
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();
问题的关键:
为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了:
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。