1. Flache Kopie und Tiefkopiekonzept
⑴ Shallow -Kopie (flaches Klonen)
Alle Variablen des kopierten Objekts enthalten den gleichen Wert wie das ursprüngliche Objekt, während alle Verweise auf andere Objekte weiterhin auf das ursprüngliche Objekt verweisen. Mit anderen Worten, flaches Kopieren kopiert einfach das zu berücksichtigende Objekt, nicht das Objekt, das es bezieht.
⑵ Deep Copy (tiefes Klonen)
Alle Variablen des kopierten Objekts enthalten den gleichen Wert wie das ursprüngliche Objekt, mit Ausnahme der Variablen, die sich auf andere Objekte beziehen. Diese Variablen, die sich auf andere Objekte beziehen, verweisen auf das kopierte neue Objekt anstelle der ursprünglichen referenzierten Objekte. Mit anderen Worten, Deep Copy kopiert alle von dem zu kopierenden Objekte, auf die Objekt verwiesen wird.
2. Javas Clone () -Methode
⑴ Die Klonmethode kopiert eine Kopie des Objekts und gibt es dem Anrufer zurück. Im Allgemeinen erfüllt die Clone () -Methode:
① Für jedes Objekt X gibt es x.clone ()! .
⑵klon von Objekten in Java
① Um eine Kopie des Objekts zu erhalten, können wir die Clone () -Methode der Objektklasse verwenden.
② Überschreiben Sie die Clone () -Methode der Basisklasse in der abgeleiteten Klasse und deklarieren Sie sie als öffentlich.
③ Nennen Sie in der Clone () -Methode der abgeleiteten Klasse Super.clone ().
④ Implementieren Sie die klonbare Schnittstelle in der abgeleiteten Klasse.
Bitte beachten Sie den folgenden Code:
öffentliche Klasse implementiert klonbar {String -Name; Student) Super.clone (); // Clone () in Objekt erkennt, welches Objekt Sie kopieren möchten. } catch (clonenotsSufortedException e) {System.out.println (e.toString ()); S2 = (Student) S1.Clone (); System.out.println ("name ="+s1.name+","+ay = "+s1.age); +s2.age); veranschaulichen:
①Warum müssen wir super.clone () nennen, wenn die Clone () -Methode des Objekts in der abgeleiteten Klasse überschreiben? Zur Laufzeit erkennt Clone () in Objekt, welches Objekt Sie kopieren möchten, und kopiert dann Platz für dieses Objekt und kopiert das Objekt, wodurch der Inhalt des ursprünglichen Objekts eins nach eins in den Speicherplatz des neuen Objekts kopiert wird.
② Die von der Java.lang.Object -Klasse geerbte Methode der Clone () ist eine flache Kopie. Der folgende Code kann dies beweisen.
Klassenprofessor {String -Name; int Alter; Student (String Name, int Age, Professor p) {this.name = name; .Clone (); ) {Professor p = neuer Professor ("Wangwu", 50); "; s2.p.age = 30; = "+s2.p.name+", "+" ay "+s2.p.age); // Die Ausgabeergebnisse der Professoren von Studenten 1 und 2 werden zu Lisi, und das Alter beträgt 30. }} Wie sollten wir also tiefes Klonen umsetzen, das heißt, der Professor, der S2 modifiziert, wird sich nicht auf den Professor auswirken, der S1 ist? Der Code wird wie folgt verbessert.
Verbesserungen, um den Professor von Student 1 unverändert zu machen (Tiefklon)
Class Professor implementiert klonbar {String -Name; Clone (); int ay, professor p) {this.name = name; } catch (clonenotsupportedexception e) {System.out.println (e.toString ()); ] args) {Professor p = neuer Professor ("Wangwu", 50); "Lisi"; System.out.println ("name ="+s1.p.name+","+"ay"+s1.p.age); "+" ay = "+s2.p.age);}} 3. Verwenden Sie die Serialisierung, um eine tiefe Kopie durchzuführen (hauptsächlich, um die Methode der Clone () der tiefen Kopie komplexerer Objekte neu zu schreiben, und kann auch den Haltepunkt kontinuierliche Übertragung und andere Funktionen implementieren)
Der Prozess des Schreibens von Objekten in Streams ist ein Serialisierungsprozess, wird jedoch sehr lebendig als "gefroren" oder "Auswahl" in den Kreisen der Java -Programmierer bezeichnet. Verfahren.
Es sollte darauf hingewiesen werden, dass das, was im Stream geschrieben ist Sei frisch.
Ein Objekt in der Java -Sprache tief kopieren kann das Objekt häufig zuerst die serialisierbare Schnittstelle implementieren und dann das Objekt (eigentlich nur eine Kopie des Objekts) in einen Stream (in Gurken eingelegt) schreiben und es dann aus dem Stream lesen (putieren Die Gurken zurück) können das Objekt rekonstruieren.
Das Folgende ist der Deep Copy -Quellcode.
öffentliches Objekt Deepclone () {// das Objekt in den Stream -BytearRayoutStream bo = neuer BytearRayoutputStream (); bo.tobytearray ()); Die Prämisse, dies zu tun, ist, dass das Objekt und alle referenzierten Objekte innerhalb des Objekts serialisierbar sind. . draußen. Der obige Beispielcode wird wie folgt verbessert.
Klassenlehrer implementiert serialisierbar {String -Name; Alter; public void Student (String -Name, int Age, Lehrer t) {this.name = name; Gehen Sie zum Stream BytearrayoutStream bo neuer Objektinputstream (BI); 18, t); name = "+s1.t.name+", "+" ay = "+s1.t.age);}}