为什么要将新的ArrayList分配给List变量?
我是java的新手,当我在网上看到很多例子的代码时,我看到人们几乎在所有情况下都将ArrayList
的变量声明为List
。
List myList = new ArrayList();
我不明白这样做是否有一些特定的优势。 为什么不能成为ArrayList
本身,如下所示:
ArrayList myList = new ArrayList();
它被称为接口编程 。 它允许您将该ArrayList
替换为LinkedList
如果您确定LinkedList
更合适的话。
因为如果您决定稍后更改它会更容易:
List myList = new ArrayList (); List myList = new LinkedList ();
在方法签名中更重要的是,当您更改返回的内容时,可以强制每个人使用您的函数来更改其代码。
这不是转换,而是您使用接口作为变量的声明类型。 这样做的原因是您可以切换正在使用的List的实现。 如果列表的用户仅依赖于List接口,则在使用其他列表类型(例如LinkedList)时,它们不会受到影响。
Java是强类型的面向对象语言。 ….让我们来看一个例子:假设你正在编写一个排序函数sort(ArrayList<> list)
。 如果以这种方式声明函数,java将不允许您使用该函数对除ArrayList
之外的任何其他函数进行排序。 更好的方法是定义一个抽象 (如你的问题所示) List
。 在该抽象中,您声明了方法。 所有实现都必须实现-define(即ArrayList)。 现在你的sort
函数可以声明为sort(List<> list)
,你可以用它对任何实现List
东西进行排序(并遵循List
方法的契约)。
通过这种方式,您可以重用为所有实现编写的代码,只要它们遵守抽象合同即可。 在Java中,您可以使用接口作为抽象和类作为实现来实现此目的。 还有其他一些优点,但是如果你想更好地理解它们,你已经阅读了一些关于面向对象编程的书。
List是一个接口,因此它可以存储从List Interface扩展的所有类的referance。如果您使用以下语句,那么在一些编程步骤之后,您还可以存储其他对象(从List扩展)referance。
List myList = new ArrayList (); ... myList =new LinkedList ();
这是代码维护的主要优点。 例如,如果有人来并希望使用LinkedList而不是ArrayList,则只需在整个代码中更改一行而不是数十亿。 它使您的代码更灵活。
java中多态性的整个概念依赖于java使用接口/基类引用来引用子类对象的能力。
此外,编程到接口而不是实际实现始终被视为最佳实践。 这将允许开发人员在需要时轻松地用其他/更好的实现替换一个实现。
1) List
是一个接口,实现类是ArrayList
2) List
接口扩展Collection
。