2014-10-09 61 views
1

我不確定如何搜索對此的答案。在Java中聲明集合

以下聲明有什麼區別?

List<Integer> al = new ArrayList<Integer>(); 
    ArrayList<Integer> al = new ArrayList<Integer>(); 

我有時會看到正在使用的第一個聲明,但作爲ArrayList的繼承它的超接口和超類的方法,我不知道爲什麼會被使用。有人能夠澄清?謝謝!

+6

因爲明天有人會希望將其更改爲「LinkedList」或「CopyOnWriteArrayList」或「MagicFairyList」。 – immibis 2014-10-09 06:48:35

+1

它是多態性的。 http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – 2014-10-09 06:49:52

回答

7

您不應該依賴於接口的實現。如果您使用List<Integer> al = new ArrayList<Integer>(); - 您將可以輕鬆更改實施,而不會影響所有其他代碼,因爲您只使用在List界面中定義的方法。

使用ArrayList<Integer> al = new ArrayList<Integer>();,您將變得與接口的一個實現綁定,並且您的類變得更緊密地與實現耦合,這通常必須避免。

1

當人們使用:

 List<Integer> al = new ArrayList<Integer>(); 

它提供了更大的靈活性,在OOP訂條款─它利用多態的特徵。 List是一個接口,ArrayList,LinkedList等是它的不同實現。在一個人的程序,如果,A1被聲明爲那麼明天出於某種原因,如果不是一個ArrayList以上,一個決定使用一些其他的List實現,人們只需要進行以下修改:

 List<Integer> al = new LinkedList<Integer>(); 

只要A1是使用不需要改變,不像後者的聲明。

希望它有幫助!

2

第一個聲明使用接口作爲refrence類型,它更具可移植性,但不提供對ArrayList特定方法的訪問。它爲您提供了改變列表實現而不影響應用程序其他部分的可能性。

第二種將類定義爲引用類型。所有依賴於此引用類型的代碼在更改時都需要進行更改。

提示:另外,如果你使用的是Java SE 7或更高版本,你可以ommit建築部分泛型類型:

List<Integer> al = new ArrayList<>(); 
0

的區別是不是在這個特定種類的代碼很多,但以下代碼使用al,區別在於代碼是否可以依賴List中定義的接口或類ArrayList定義的接口,這會打開更多實現細節。

此外,一個實際的例子是當你不自己構造al,而是讓一個方法構造它,使得方法創建者必須決定返回類型是具體類型還是接口類型,以及該方法的實施與該方法的用戶有多緊密。

例子:

public ArrayList<String> createArrayList() { 
    return new ArrayList<String>(); // is bound to the return type and a change my break code relying on the methods contract 
} 

public List<String> createList() { 
    return new ArrayList<String>(); // can be changed to any other List implementation as the code relying on the method contract can only assume implementations of List 
} 
0

請閱讀 '運行時多態性' 和 '動態方法分派' 在Java中。您的幫助....try this link