OOP:ArrayList al = new ArrayList()和List al = new ArrayList()之间的区别?

可能重复:
列表与ArrayList

之间的区别

ArrayList al = new ArrayList() 

 List al = new ArrayList() ? 

没有,从创作的角度来看。 两者都创建ArrayList的实例。

不同之处在于,在第二个示例中, al允许访问List接口上实现的所有方法,而在第一个示例中, al允许访问ArrayList类的所有(可访问)方法和字段。

一个实用的经验法则:使用第二种模式。 如果你需要一些来自ArrayList实现的额外好东西,那么你总是可以强制转换:

  List list = new ArrayList(); // do some adds/removes/... on the list ((ArrayList) list).trimToSize(); 

它称为编程接口。 假设您需要从方法中返回此list 。 因此调用代码可以将其转换为List变量。

 public ArrayList getList() { ArrayList list = new ArrayList(); // do something with the list here return list; } 

还有这个,

 public List getList() { List list = new ArrayList(); // do something with the list here return list; } 

现在对于后一种方法,调用代码可以在List类型变量中返回返回的列表。 你可以稍后轻易地决定,出于某种原因,这样的事情,

 public List getList() { List list = new LinkedList(); // do something with the list here return list; } 

调用代码没有变化,而前者需要更改返回类型,这最终会搞砸调用代码。

解释我对这个关于Map vs. HashMap 类似问题的 回答 :

对象之间没有区别。 您对该对象的界面有所不同。 在第一种情况下,接口是ArrayList ,而在第二种情况下,它是List 。 但是,底层对象是相同的。

使用List的优点是,您可以将基础对象更改为不同类型的列表,而不会违反与使用它的任何代码的合同。 如果将其声明为ArrayList ,则必须更改合同,如果要更改基础实现。