2017-04-18 4 views
2

Ich bin ziemlich neu in Java und ich wollte wissen, was das bedeutet eigentlich:Was bedeutet "Liste <Integer> list = new ArrayList <Integer>();" eigentlich bedeuten?

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

diese Frage von anderen zu unterscheiden, habe ich die Beiträge über Polymorphismus und den Unterschied zwischen Beispiel 2 1 und Beispiel gelesen habe, und ich verstehe, dass Beispiel 1 ermöglicht "Programmierung zu Schnittstelle." Ich verstehe auch, dass die Liste mit Beispiel 1 leicht zu LinkedList geändert werden kann, ohne den Rest des Codes zu beeinflussen.

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

Aber was ich wissen will, was Beispiel 1 eigentlich bedeutet. Erstellt es eine neue Liste? Oder erstellt es eine neue ArrayList? Hat das resultierende Objekt die Eigenschaften einer Liste? Oder hat das resultierende Objekt die Eigenschaften einer ArrayList? Kann ich Methoden implementieren, die eine ArrayList in der Liste ohne einen Kompilierungsfehler verwendet?

Dies ist mein erstes Mal eine Frage zu stellen, also lassen Sie mich bitte wissen, wenn ich Verbesserungen machen kann.

+0

Zunächst einmal ist die Arraylist konkrete Umsetzung der Liste, erstellt exampl1 eine neue Liste der Typ Arraylist (konkrete Umsetzung). Die Variable "list" hat die Eigenschaften/Methoden von ArrayList. – imprezzeb

+0

[Möglicherweise ein Duplikat] (http: // stackoverflow.com/questions/14903145/Was ist der Unterschied zwischen Listen- und Arraylist? – gks

+1

Mögliches Duplikat von [Type List vs. type ArrayList in Java] (http://stackoverflow.com/questions/2279030/type- list-vs-type-arraylist-in-java) – ZhekaKozlov

Antwort

2

In beiden Beispielen erstellt nur der Ausdruck new Instanzen von Objekten (die rechte Seite des =), die linke Seite definiert nur eine Variable, die auf das Objekt zeigt, das Sie erstellt haben. In beiden Fällen ist das von Ihnen erstellte Objekt vom Typ ArrayList.

List ist eine Schnittstelle, keine Klasse, und Schnittstellen selbst können nicht instanziiert werden.Aber ArrayListimplementiert die Schnittstelle List, so können Sie eine Instanz von ArrayList einer Variablen des Typs List zuweisen.

Der Vorteil des Beispiels 1 ist, dass Sie später entscheiden können, eine weitere Implementierung von List (wie LinkedList) und den gesamten Code zu erstellen, der die List Typ für Variablen verwendet wurde, wird nach wie vor ohne Änderung arbeiten. Wenn Sie später in Beispiel 2 entscheiden, dass Sie einen anderen Typ von List benötigen, müssen Sie den Typ aller Variablen ändern, die auf das tatsächliche Objekt verweisen.

Ihre Fragen:

Aber was will ich wissen, was Beispiel 1 eigentlich bedeutet. Erzeugt es eine neue Liste? Oder erstellt es eine neue ArrayList?

Erzeugt eine neue ArrayList.

Hat das resultierende Objekt die Eigenschaften einer Liste? Oder hat das resultierende Objekt die Eigenschaften einer ArrayList?

Das resultierende Objekt hat alle Eigenschaften eines ArrayList.

jedoch durch die variable list, die als Typ List, nur die Methoden in den Schnittstellen definiert zugreifen können List.

Aber Sie können verwenden Typ-Casting die Methoden in ArrayList wie diese zugreifen, wenn Sie später brauchen (aber es gibt wenig Grund, wie Arraylist nicht viel darüber hinaus hat, was in List)

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

Vielen Dank für Ihre Antwort! Die Erwähnung von "Typ-Casting" hat Ihre Antwort wirklich geklärt und ist genau das, was ich hören musste. –

0

Das Deklarieren einer Variablen aus der implementierten Schnittstelle wird normalerweise bevorzugt. Je nachdem, welche Schnittstelle oder abstrakte Klasse Sie verwenden, können Sie jedoch den Zugriff auf einige Methoden verlieren.

Grundsätzlich ermöglicht es Ihrem Programm, flexibler zu werden.

Ihre Frage zu:

Ihr erstes Beispiel eine List deklariert und initialisiert es als ArrayList. Sie können nur Methoden von der List-Schnittstelle und ihren übergeordneten Klassen/Schnittstellen aufrufen.

Ihr zweites Beispiel deklariert ein ArrayList und initialisiert sie als ArrayList, das heißt, Sie haben nun Zugang zum Aufruf von Methoden in der ArrayList Klasse, wie ArrayList#ensureCapacity oder ArrayList#trimToSize.

1

Wie Sie vielleicht bereits wissen, ist List eine Schnittstelle und ArrayList ist eine Klasse. Es bedeutet, dass List mehr Generäle sind, während ArrayList spezifischer ist.

In Beispiel 1 können Sie die zusätzlichen Methoden, die von ArrayList unterstützt werden, z. Sie können SureCapacity nicht aufrufen, da sie in der Arraylist-Klasse implementiert ist.

Im Gegensatz zu Beispiel 2 können Sie alle Funktionen aufrufen, die von ArrayList unterstützt werden. Der Vorteil der Verwendung von Beispiel 1 besteht darin, die Flexibilität zu erhöhen und Codeänderungen zu minimieren, falls sich die Implementierung ändert, z. In Zukunft entscheiden Sie sich für LinkedList. Sie müssen sich nicht darum kümmern, Änderungen an allen Zeilen vorzunehmen, an denen die Listenvariable verwendet wurde.

0

Angenommen, Sie haben eine Methode, die ein List Objekt als Parameter empfängt.

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

durch das Beispiel 1 verwendet, haben Sie die Flexibilität, ohne jede Art von Casting zu dieser Methode verschiedene Implementierungen der List Schnittstelle übergeben.

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

Es gehört nicht zu Java, ist es zu OOP gehören:

Nichts passiert eigentlich mit dem Objekt, wenn Sie einen Verweis auf sie auf eine Variable von einigen Supertyp oder Schnittstelle zuweisen. Sie können nur Methoden aufrufen, die für diesen deklarierten Typ in der Variablen sichtbar sind.

Und denken Sie daran, dass jede Klasse eine Schnittstelle implementieren müssen alle davon implementieren Methoden ist

Verwandte Themen