Mit der Methode
clone() wird eine Kopie eines Objekts einer Klasse erstellt, die die Schnittstelle Cloneable implementiert. Standardmäßig wird Feld für Feld kopiert, da die Object-Klasse die Mitglieder der spezifischen Klasse nicht kennt, deren Objekt diese Methode aufruft. Wenn die Klasse also nur über primitive Datentypelemente verfügt, wird eine neue Kopie des Objekts erstellt und ein Verweis auf die neue Kopie des Objekts zurückgegeben. Wenn die Klasse jedoch Mitglieder eines beliebigen Klassentyps enthält, werden nur die Objektverweise auf diese Mitglieder kopiert, sodass die Elementverweise sowohl im ursprünglichen als auch im geklonten Objekt auf dasselbe Objekt verweisen.
Wenn wir versuchen, die Methode clone() für ein Objekt einer Klasse aufzurufen, die die Schnittstelle Cloneable nicht implementiert, erhalten wir eine CloneNotSupportedException . Bei der Schnittstelle handelt es sich um eine getaggte Schnittstelle, deren Implementierung einfach angibt, dass die Methode Object.clone() für ein Objekt der implementierenden Klasse aufgerufen werden kann.
<strong>protected Object clone() throws CloneNotSupportedException</strong>
Wir können die clone()-Methode auf zwei Arten implementieren
Dies ist das Ergebnis der standardmäßigen Klonfunktionalität, die von der Object.clone()-Methode bereitgestellt wird (wenn die Klasse auch nicht- grundlegende Datentypmitglieder). Beim flachen Kopieren verweist das geklonte Objekt auch auf dasselbe Objekt, auf das das Originalobjekt verweist, da nur die Objektreferenz kopiert wird und nicht das referenzierte Objekt.
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("Tutorialspoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
Welcome to Tutorialspoint! Welcome to Tutorialspoint!
Wir müssen das clone()Methodenmitglied für Nicht-Basistyp-Klassen überschreiben, um Deep Copy zu implementieren, da es auch das klonen muss Mitgliedsobjekt. Der Standard-Klonmechanismus führt dies nicht aus.
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" TutorialsPoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
Welcome to TutorialsPoint! Welcome to
Das obige ist der detaillierte Inhalt vonWelche Bedeutung hat die clone()-Methode in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!