我不確定如何搜索對此的答案。在Java中聲明集合
以下聲明有什麼區別?
List<Integer> al = new ArrayList<Integer>();
ArrayList<Integer> al = new ArrayList<Integer>();
我有時會看到正在使用的第一個聲明,但作爲ArrayList的繼承它的超接口和超類的方法,我不知道爲什麼會被使用。有人能夠澄清?謝謝!
我不確定如何搜索對此的答案。在Java中聲明集合
以下聲明有什麼區別?
List<Integer> al = new ArrayList<Integer>();
ArrayList<Integer> al = new ArrayList<Integer>();
我有時會看到正在使用的第一個聲明,但作爲ArrayList的繼承它的超接口和超類的方法,我不知道爲什麼會被使用。有人能夠澄清?謝謝!
您不應該依賴於接口的實現。如果您使用List<Integer> al = new ArrayList<Integer>();
- 您將可以輕鬆更改實施,而不會影響所有其他代碼,因爲您只使用在List
界面中定義的方法。
使用ArrayList<Integer> al = new ArrayList<Integer>();
,您將變得與接口的一個實現綁定,並且您的類變得更緊密地與實現耦合,這通常必須避免。
當人們使用:
List<Integer> al = new ArrayList<Integer>();
它提供了更大的靈活性,在OOP訂條款─它利用多態的特徵。 List是一個接口,ArrayList,LinkedList等是它的不同實現。在一個人的程序,如果,A1被聲明爲那麼明天出於某種原因,如果不是一個ArrayList以上,一個決定使用一些其他的List實現,人們只需要進行以下修改:
List<Integer> al = new LinkedList<Integer>();
只要A1是使用不需要改變,不像後者的聲明。
希望它有幫助!
第一個聲明使用接口作爲refrence類型,它更具可移植性,但不提供對ArrayList特定方法的訪問。它爲您提供了改變列表實現而不影響應用程序其他部分的可能性。
第二種將類定義爲引用類型。所有依賴於此引用類型的代碼在更改時都需要進行更改。
提示:另外,如果你使用的是Java SE 7或更高版本,你可以ommit建築部分泛型類型:
List<Integer> al = new ArrayList<>();
的區別是不是在這個特定種類的代碼很多,但以下代碼使用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
}
請閱讀 '運行時多態性' 和 '動態方法分派' 在Java中。您的幫助....try this link
因爲明天有人會希望將其更改爲「LinkedList」或「CopyOnWriteArrayList」或「MagicFairyList」。 – immibis 2014-10-09 06:48:35
它是多態性的。 http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – 2014-10-09 06:49:52