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.
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.
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.
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.
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.
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.
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.
Tags und Links java deep-copy shallow-copy