我不确定如何搜索答案。
以下声明之间有什么区别?
List<Integer> al = new ArrayList<Integer>();
ArrayList<Integer> al = new ArrayList<Integer>();
我有时会看到第一个声明被使用,但是当ArrayList从它的超级接口和超类继承方法时,我不确定为什么要使用它。有人能够澄清吗?谢谢!
答案 0 :(得分:6)
您不应该依赖于接口的实现。如果您使用List<Integer> al = new ArrayList<Integer>();
- 您将能够轻松更改实施,而不会影响所有其他代码,因为您只使用List
界面中定义的方法。
使用ArrayList<Integer> al = new ArrayList<Integer>();
,您将被绑定到接口的一个实现,并且您的类将更紧密地耦合到实现,这通常必须避免。
答案 1 :(得分:2)
第一个声明使用接口作为引用类型,它更具可移植性,但不提供对ArrayList特定方法的访问。它使您可以更改List的实现,而不会影响应用程序的其他部分。
第二个将类定义为引用类型。更改时,需要更改依赖于此引用类型的所有代码。
提示:此外,如果您使用的是Java SE 7或更高版本,则可以省略构造部分中的泛型类型:
List<Integer> al = new ArrayList<>();
答案 2 :(得分:1)
当使用时:
List<Integer> al = new ArrayList<Integer>();
它提供了更多的灵活性,在OOP术语中 - 它利用了多态性的特征。 List是一个接口,ArrayList,LinkedList等是它的不同实现。在一个程序中,如果a1被声明如上,那么明天由于某种原因,如果不是ArrayList,则决定使用其他List实现,只需进行以下更改:
List<Integer> al = new LinkedList<Integer>();
无论在何处使用a1都不需要改变,与后者的声明不同。
希望它有所帮助!
答案 3 :(得分:0)
在这种特定类型的代码上差别不大,但是对于使用al
的以下代码,区别在于代码是否可以依赖{{1}中定义的接口或者由类List
定义的接口,这将打开更多的实现细节。
此外,一个实际的例子是当你不自己构造ArrayList
而是让一个方法构造它时,方法创建者必须决定返回类型是具体类型还是接口类型以及该方法的实现与该方法的用户绑定的紧密程度。
示例:
al
答案 4 :(得分:0)
请阅读Java中的'Runtime Polymorphism'和'Dynamic Method Dispatch'。为了您的帮助.... try this link