54 Stimmen

Java : clone()-Operation mit Aufruf von super.clone()

Ich verstehe die Idee nicht ganz, super.clone() in der clone()-Methode einer Klasse zurückzugeben. Erstens, würde das nicht bedeuten, dass ein Objekt zurückgegeben wird, das eine Superklasse ist, die WENIGER Daten enthält als angefordert, weil eine Superklasse "keine" Unterklasse ist, aber eine Unterklasse "eine" Superklasse ist. Und wenn es eine lange Kette von Unterklassen gäbe, von denen jede super.clone() aufruft, warum würde das nicht dazu führen, dass sie schließlich Object.clone() an der Wurzel der Kette aufruft, die keine der Unterklassen ist?

Tut mir leid, wenn das verwirrend war; ich verwirre mich manchmal selbst.

61voto

Laurent Pireyn Punkte 6627

Die Umsetzung der clone() en Object prüft, ob die aktuelle Klasse implementiert Cloneable und erstellt eine Instanz dieser aktuellen Klasse.

Wenn Sie also Ihre Klasse klonbar machen wollen, müssen Sie Folgendes implementieren Cloneable y nach unten gerichtet das Ergebnis von super.clone() für Ihre Klasse. Eine weitere Belastung ist, dass der Aufruf von super.clone() kann eine CloneNotSupportedException das Sie abfangen müssen, obwohl Sie wissen, dass es nicht passieren wird (da Ihre Klasse die Cloneable ).

Le site Cloneable Schnittstelle und der clone Methode auf der Object Klasse sind ein offensichtlicher Fall von fehlgeschlagenem objektorientiertem Design.

7voto

Assaf Adato Punkte 237

Stellen Sie sich folgendes vor: Sie haben eine Kette von vererbenden Klassen. Jede kann (oder auch nicht) ihre eigenen Variablen haben. Was clone macht, im Gegensatz zum Gleichheitsoperator (==), der die Referenz dupliziert, ist eine geklonte Kopie des Objekts mit einer neuen Referenz. In dem obigen Beispiel möchten Sie das letzte Objekt in der Kette klonen. Da das letzte Objekt aus seinen Oberklassen aufgebaut ist, von denen jede eine andere Implementierung der Klonmethode haben kann, ist es sehr sinnvoll, die Implementierung von clone in der Oberklasse aufzurufen, um zuerst ein geklontes Elternobjekt zu erhalten, bevor das eigene Objekt geklont wird.

Ein weiterer Begriff, der üblicherweise mit dem Klonen in Verbindung gebracht wird, ist das oberflächliche und tiefe Klonen. Das oberflächliche Klonen bezieht sich auf die Erstellung einer exakten Kopie eines Objekts, während das tiefe Klonen eine Kopie eines Objekts und aller untergeordneten Objekte erstellt, auf die sich das ursprüngliche Objekt bezieht.

Mehr zum Klonen unter dieser Link

5voto

JB Nizet Punkte 654813

Lesen Sie die [Javadoc von Object.clone()](http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()) sorgfältiger: Sie gibt eine Kopie des Objekts zurück. Die Kopie ist eine weitere Instanz der gleichen Klasse wie die des Objekts, für das clone aufgerufen wurde. D.h. foo.clone().getClass() == foo.getClass() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X