Ist clone () in Java flache Kopie?

8

Ist clone() in Java eine flache Kopie?

  

Irgendwann kommt das auf den Klon ()   Methode des Objekts (der oberste   Klasse), die eine neue Instanz erstellt   der gleichen Klasse wie das Objekt und   Kopiert alle Felder in das neue Feld   Instanz (eine "flache Kopie").

Ich lese das von wikipedia .

Ich verstehe nicht, warum es eine flache Kopie ist. clone() erstellt eine neue Instanz mit allen Feldern. Ist das nur eine tiefe Kopie? verwirrt. Brauchen Sie eine Erklärung für mich.

    
Josh Morrison 11.03.2011, 22:56
quelle

8 Antworten

14

Der Standardwert Object.clone() ist in der Tat eine flache Kopie. Es ist jedoch so konzipiert, dass CloneNotSupportedException ausgelöst wird, es sei denn, Ihr Objekt implementiert Cloneable .

Und wenn Sie Cloneable implementieren, sollten Sie clone() überschreiben, damit es eine tiefe Kopie ausführt, indem Sie clone() für alle Felder aufrufen, die selbst geklont werden können.

    
Chris Jester-Young 11.03.2011, 23:00
quelle
5

Nebenbei, ich bin überrascht, dass niemand die Ansichten von Joshua Bloch über Cloneable erwähnt hat

  

Wenn Sie den Artikel zum Klonen gelesen haben   in meinem Buch, vor allem, wenn Sie lesen   zwischen den Zeilen wirst du das wissen   Ich denke, Klon ist tief gebrochen. Dort   sind ein paar Designfehler, die größten   Das ist das Klonbare Interface   hat keine Klonmethode. Und das   bedeutet es funktioniert einfach nicht: machen   etwas Klonbares sagt nicht   irgendetwas über das, was Sie damit tun können   es. Stattdessen sagt es etwas darüber aus   was es intern tun kann. Es sagt   dass, wenn Sie super.clone aufrufen   Immer wieder ruft es Objects auf   Clone-Methode wird diese Methode zurückgegeben   eine Feldkopie des Originals.

    
Brian Agnew 11.03.2011 23:53
quelle
4

clone () erstellt eine Kopie aller Felder. Java hat primitive Typen und Referenzen - wenn Sie Ihr Objekt klonen, erhalten Sie ein neues Objekt mit Kopien aller primitiven Felder (es ist wie eine tiefe Kopie), aber Sie haben auch eine Kopie aller Referenzfelder. Im Ergebnis erhalten Sie zwei Objekte mit eigenen Kopien von Primitiven und Kopien von Referenzen auf dieselben Objekte - sowohl das ursprüngliche als auch das kopierte Objekt werden die gleichen Objekte verwenden.

    
Max K 11.03.2011 23:03
quelle
3

Einige Objekte bieten keine tiefe Kopie. Zum Beispiel wird eine ArrayList die Liste klonen, aber nicht die Elemente in der Liste. Das Folgende stammt aus dem JavaDoc für ArrayList :

%Vor%
    
jt. 11.03.2011 23:02
quelle
2

Es handelt sich um eine seichte Kopie, da nur die Referenz auf andere Objekte kopiert wird. Sagen wir, wir haben diese Klassen:

%Vor%

Und jetzt machen wir einen Klon einer Instanz von A:

%Vor%

Die B-Instanz in firstA und secondA wird identisch sein. Sie haben keine Kopie der B-Instanz. Aus diesem Grund soll clone () eine seichte Kopie erstellen.

Die Diagramme auf der von Ihnen verlinkten Seite sollten Ihnen helfen, das alles zu verstehen.

    
krtek 11.03.2011 23:08
quelle
1

Was clone macht, wird für jedes Objekt definiert, das Klon unterstützt. Object.clone ist geschützt, also erlaubt kein Objekt den Klon, es sei denn jemand hat es spezifisch definiert.

    
bmargulies 11.03.2011 23:00
quelle
1

Die Standardimplementierung von Object.clone () ist eine flache Kopie. Dieses Verhalten ist immer noch nützlich für Typen, die eine große Anzahl primitiver Felder oder unveränderbarer Felder enthalten. Sie können Wie klont man die Klonmethode richtig überschreiben? , wie man sie richtig überschreibt es. Nach dem Aufruf von super.clone () und anschließender Umwandlung des resultierenden Objekts können Sie nach Bedarf tiefer klonen.

Implizit verringert sich der Wert des Klons, wenn die Anzahl der komplexen, veränderbaren Felder auf Ihrem Typ zunimmt.

    
Dilum Ranatunga 11.03.2011 23:10
quelle
0

Ja.

Aber zuerst müssen Sie, dass Ihre Klasse Cloneable implementieren und Ausnahme auslösen

%Vor%

Ausgabe: true

    
Vladp 11.03.2011 23:08
quelle

Tags und Links