2017-04-18 135 views
2

我非常新的Java和我想知道這實際上意味着:什麼是「列表<Integer> list = new ArrayList <Integer>();」其實是什麼意思?

List<Integer> list = new ArrayList<Integer>(); //Example 1 

,以區分各個這個問題,我讀過有關多態性與例1和2的區別的帖子,我也明白例1允許「編程接口」。我也明白,使用示例1,可以輕鬆地將列表更改爲LinkedList,而不會影響其餘的代碼。

ArrayList<Integer> list = new ArrayList<Integer>(); //Example 2 

但是我想知道例1實際意味着什麼。它是否創建一個新的列表?或者它創建一個新的ArrayList?結果對象是否具有List的屬性?或者結果對象是否具有ArrayList的屬性?我是否可以實現ArrayList在列表中使用的方法,而不會出現編譯錯誤?

這是我第一次發佈問題,所以請讓我知道,如果我可以做任何改進。

+0

首先,ArrayList的是具體的List實現,exampl1創建ArrayList類型(具體實現)的一個新的列表。變量「list」具有ArrayList的屬性/方法。 – imprezzeb

+0

[可能重複](http:// stackoverflow。com/questions/14903145/list-and-arraylist之間的區別是什麼) – gks

+1

[類型列表與Java中的類型ArrayList]可能的重複(http://stackoverflow.com/questions/2279030/type- list-vs-type-arraylist-in-java) – ZhekaKozlov

回答

2

在這兩個示例中,只有表達式new創建了對象的實例(=的右側),左側僅定義了一個指向您創建的對象的變量。

在這兩種情況下,您創建的對象都是ArrayList類型。

List是一個接口,而不是一個類,接口本身不能實例化。但是ArrayList實現了接口List,因此您可以將ArrayList的實例分配給List類型的變量。

例1的優勢在於,可以在以後決定創建的List另一種實現方式(如LinkedList),並且是使用List類型的變量仍然沒有任何變化工作的所有代碼。而在示例2中,如果您稍後決定需要不同類型的List,則需要更改指向實際對象的所有變量的類型。

您的問題:

但我想知道什麼是例1實際上意味着什麼。它是否創建 一個新的列表?或者它創建一個新的ArrayList?

它創建一個新的ArrayList

是否生成的對象有一個列表的屬性?還是 生成的對象具有ArrayList的屬性?

所得對象具有所有的ArrayList的屬性。

但是,通過變量list(其類型爲List),您只能訪問接口List中定義的方法。

但是你可以使用型鑄造訪問ArrayList這樣的方法,如果你以後需要(但如ArrayList中沒有什麼理由遠遠超出在列表什麼)

List<Integer> list = new ArrayList<Integer>(); //Example 1 
ArrayList<Integer> arrayList = (ArrayList<Integer>) list; // type-cast 
+0

謝謝你的回答!提及「類型轉換」確實說明了你的答案,這正是我需要聽到的。 –

0

從其實現的接口聲明變量通常是首選,但取決於您使用的接口或抽象類,您可能會失去對某些方法的訪問權限。

基本上,它可以讓你的程序變得更加靈活。

關於你的問題:

你的第一個示例聲明List並初始化它作爲一個ArrayList。您只能調用List接口及其父類/接口的方法。

你的第二個示例聲明的ArrayList並初始化它作爲一個ArrayList,這意味着你現在有機會來調用ArrayList類的方法,如ArrayList#ensureCapacityArrayList#trimToSize

1

正如您可能已經知道的那樣,List是一個接口,ArrayList是一個類。這意味着List是更通用的,而ArrayList更具體。

在示例1中,您無法調用ArrayList支持的其他方法,例如你不能調用ensureCapacity,因爲它是在Arraylist類中實現的。

與示例2不同,您可以調用ArrayList支持的所有功能。使用示例1的益處在於增加靈活性並在實現改變的情況下使代碼變化最小化,例如,在將來你決定使用LinkedList。您無需擔心對使用list變量的所有行進行任何更改。

0

假設你有收到List對象作爲參數的方法。

public void myMethod(List<Integer> myList) { ... } 

通過使用實施例1你有傳遞List接口的不同實現這種方法沒有任何類型的鑄件的靈活性。

List<Integer> list1 = new ArrayList<Integer>(); 
List<Integer> list2 = new LinkedList<Integer>(); 
myMethod(list1); 
myMethod(list2); 
-1

它不屬於java的,它是屬於OOP:當你將一些超類型或接口的變量的引用

沒有實際發生的對象。您將只能調用對該變量上的該聲明類型可見的方法。

請記住,任何類實現一個接口,必須實現這一切是方法