Beim Klonen von Objekten wird eine exakte Kopie eines Objekts erstellt. Es erstellt eine neue Instanz der Klasse des aktuellen Objekts und initialisiert alle seine Felder mit genau den Inhalten der entsprechenden Felder dieses Objekts.
Methoden zum Durchführen des Objektklonens in Java
Es gibt drei Methoden zum Erstellen des Objektklonens in Java, die im Folgenden aufgeführt sind:
- Verwenden des Zuweisungsoperators zum Erstellen einer Kopie der Referenzvariablen
- Erstellen einer Kopie mit der Methode clone()
- Verwendung der clone()-Methode – Deep Copy
1. Verwenden des Zuweisungsoperators zum Erstellen eines Kopie davon Referenzgröße
In Java gibt es keinen Operator zum Erstellen einer Kopie eines Objekts. Im Gegensatz zu C++ wird in Java bei Verwendung des Zuweisungsoperators eine Kopie der Referenzvariablen und nicht des Objekts erstellt. Dies lässt sich anhand eines Beispiels erklären. Das folgende Programm demonstriert dasselbe.
Nachfolgend finden Sie die Umsetzung des oben genannten Themas:
Java
Java char zu int
// Java program to demonstrate that assignment operator> // only creates a new reference to same object> import> java.io.*;> > // A test class whose objects are cloned> class> Test {> >int> x, y;> >Test()> >{> >x =>10>;> >y =>20>;> >}> }> > // Driver Class> class> Main {> >public> static> void> main(String[] args)> >{> >Test ob1 =>new> Test();> > >System.out.println(ob1.x +>' '> + ob1.y);> > >// Creating a new reference variable ob2> >// pointing to same address as ob1> >Test ob2 = ob1;> > >// Any change made in ob2 will> >// be reflected in ob1> >ob2.x =>100>;> > >System.out.println(ob1.x +>' '> + ob1.y);> >System.out.println(ob2.x +>' '> + ob2.y);> >}> }> |
>
>Ausgabe
10 20 100 20 100 20>
2. Erstellen einer Kopie mit der Methode clone()
Die Klasse, deren Objektkopie erstellt werden soll, muss über eine öffentliche Klonmethode in ihr oder in einer ihrer übergeordneten Klassen verfügen.
- Jede Klasse, die clone() implementiert, sollte super.clone() aufrufen, um die Referenz auf das geklonte Objekt zu erhalten.
- Die Klasse muss auch die java.lang.Cloneable-Schnittstelle implementieren, deren Objektklon wir erstellen möchten, andernfalls wird eine CloneNotSupportedException ausgelöst, wenn die Klonmethode für das Objekt dieser Klasse aufgerufen wird.
Syntax:
protected Object clone() throws CloneNotSupportedException>
i) Verwendung der clone()-Methode – Shallow Copy
Notiz – Im folgenden Codebeispiel erstellt die clone()-Methode ein völlig neues Objekt mit einem anderen HashCode-Wert, was bedeutet, dass es sich an einem separaten Speicherort befindet. Da sich das Testobjekt c jedoch in Test2 befindet, haben die primitiven Typen eine tiefe Kopie erreicht, dieses Testobjekt c wird jedoch weiterhin von t1 und t2 gemeinsam genutzt. Um dies zu umgehen, erstellen wir explizit eine tiefe Kopie für die Objektvariable c, die später besprochen wird.
Java
// A Java program to demonstrate> // shallow copy using clone()> import> java.util.ArrayList;> > // An object reference of this class is> // contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with shallow copy.> class> Test2>implements> Cloneable {> >int> a;> >int> b;> >Test c =>new> Test();> >public> Object clone()>throws> CloneNotSupportedException> >{> >return> super>.clone();> >}> }> > // Driver class> public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t2 = (Test2)t1.clone();> > >// Creating a copy of object t1> >// and passing it to t2> >t2.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t2.c.x =>300>;> > >// Change in object type field will be> >// reflected in both t2 and t1(shallow copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t2.a +>' '> + t2.b +>' '> + t2.c.x> >+>' '> + t2.c.y);> >}> }> |
fmovies
>
>Ausgabe
10 20 300 40 100 20 300 40>
Im obigen Beispiel gibt t1.clone die flache Kopie des Objekts t1 zurück. Um eine tiefe Kopie des Objekts zu erhalten, müssen nach dem Erhalt der Kopie bestimmte Änderungen in der Klonmethode vorgenommen werden.
ii) Verwendung der clone()-Methode – Deep Copy
- Wenn wir eine tiefe Kopie von Objekt X oder Y werden nur in diesem Objekt widergespiegelt und nicht in dem anderen. Im folgenden Beispiel erstellen wir eine tiefe Kopie des Objekts.
- Eine tiefe Kopie kopiert alle Felder und erstellt Kopien des dynamisch zugewiesenen Speichers, auf den die Felder verweisen. Eine tiefe Kopie liegt vor, wenn ein Objekt zusammen mit den Objekten kopiert wird, auf die es verweist.
Java
// A Java program to demonstrate> // deep copy using clone()> > // An object reference of this> // class is contained by Test2> class> Test {> >int> x, y;> }> > // Contains a reference of Test and> // implements clone with deep copy.> class> Test2>implements> Cloneable {> >int> a, b;> > >Test c =>new> Test();> > >public> Object clone()>throws> CloneNotSupportedException> >{> >// Assign the shallow copy to> >// new reference variable t> >Test2 t = (Test2)>super>.clone();> > >// Creating a deep copy for c> >t.c =>new> Test();> >t.c.x = c.x;> >t.c.y = c.y;> > >// Create a new object for the field c> >// and assign it to shallow copy obtained,> >// to make it a deep copy> >return> t;> >}> }> > public> class> Main {> >public> static> void> main(String args[])> >throws> CloneNotSupportedException> >{> >Test2 t1 =>new> Test2();> >t1.a =>10>;> >t1.b =>20>;> >t1.c.x =>30>;> >t1.c.y =>40>;> > >Test2 t3 = (Test2)t1.clone();> >t3.a =>100>;> > >// Change in primitive type of t2 will> >// not be reflected in t1 field> >t3.c.x =>300>;> > >// Change in object type field of t2 will> >// not be reflected in t1(deep copy)> >System.out.println(t1.a +>' '> + t1.b +>' '> + t1.c.x> >+>' '> + t1.c.y);> >System.out.println(t3.a +>' '> + t3.b +>' '> + t3.c.x> >+>' '> + t3.c.y);> >}> }> |
>
>Ausgabe
10 20 30 40 100 20 300 40>
Im obigen Beispiel können wir sehen, dass ein neues Objekt für die Testklasse zugewiesen wurde, um ein Objekt zu kopieren, das an die Klonmethode zurückgegeben wird. Dadurch erhält t3 eine tiefe Kopie des Objekts t1. Daher werden alle bis t3 in den „c“-Objektfeldern vorgenommenen Änderungen nicht in t1 widergespiegelt.
Deep Copy vs. Shallow Copy
Es gibt bestimmte Unterschiede zwischen der Verwendung von clone() als tiefe Kopie und der Verwendung als flache Kopie, wie unten erwähnt:
- Flache Kopie ist die Methode zum Kopieren eines Objekts und wird beim Klonen standardmäßig befolgt. Bei dieser Methode werden die Felder eines alten Objekts X in das neue Objekt Y kopiert. Beim Kopieren des Objekttypfelds wird die Referenz nach Y kopiert, d ist ein primitiver Typ, der den Wert des primitiven Typs kopiert.
- Daher werden alle Änderungen, die an referenzierten Objekten in Objekt X oder Y vorgenommen werden, in anderen Objekten widergespiegelt.
Flache Kopien sind günstig und einfach herzustellen. Im obigen Beispiel haben wir eine flache Kopie von erstellt Die Objekt.
Warum die Klonmethode () oder verwenden? Vorteile der Klonmethode
- Wenn wir den Zuweisungsoperator verwenden, um eine Objektreferenz einer anderen Referenzvariablen zuzuweisen, zeigt diese auf denselben Adressort des alten Objekts und es wird keine neue Kopie des Objekts erstellt. Aus diesem Grund werden alle Änderungen der Referenzvariablen im Originalobjekt widergespiegelt.
- Wenn wir einen Kopierkonstruktor verwenden, müssen wir alle Daten explizit kopieren, d. h. wir müssen alle Felder der Klasse im Konstruktor explizit neu zuweisen. Bei der Klonmethode wird diese Arbeit des Erstellens einer neuen Kopie jedoch von der Methode selbst erledigt. Um zusätzliche Verarbeitung zu vermeiden, verwenden wir das Klonen von Objekten.