为什么要将新的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