Nachdem ich es auf Papier gelesen habe, wird mir klar, dass ich es im Detail machen muss
--Lu You Fragen Sie den Kanal, wie klar er ist, damit es eine Quelle lebendigen Wassers gibt - Zhu Xi
Klonen und Kopieren: Wenn es ein Objekt gibtPerson p1=neu Person("Name",Alter; wirkt sich auf die andere Partei aus. Wenn der Parameter der Funktion ein Objekt ist, wird der Referenztyp übergeben und die Operationen innerhalb der Objektfunktion wirken sich auf das externe Objekt aus. Wenn Sie eine Kopie des Objekts übertragen möchten, müssen Sie die clone()-Methode von Objekt verwenden. ) Das Kopierobjekt gibt ein neues Objekt zurück, keine Referenz; der Unterschied zwischen dem Kopierobjekt und dem vom neuen-Operator zurückgegebenen Objekt besteht darin, dass dieses Kopierobjekt bereits einige Informationen enthält das ursprüngliche Objekt und nicht die ursprünglichen Informationen des Objekts. Wann sollte man shallow verwenden? Klonen (flache Kopie, Schattenkopie) , wann tiefer Klon (tiefe Kopie) verwendet werden soll: Dies hängt hauptsächlich von der Art des spezifischen Domänenobjekts ab. Wenn es sich um einen -Basistyp handelt, Verwenden Sie den flachen Klon , wenn es sich um eine Referenz handelt Variable (Referenz Variable) verwendet Deep Clone. Schritte zum Implementieren des Klonens: (1) Implementieren Sie die Cloneable-
-Schnittstelle. Es gibt keine abstrakten Methoden, die als Flag-Schnittstellen bezeichnet werden.
(2) Überschreiben Sie die Klonmethode der Basisklasse und deklarieren Sie sie als öffentlich (3) Überschreiben Sie die Klonmethode in der abgeleiteten Klasse und rufen Sie
super.clone auf ( )
Beim Klonen ist es in flache Kopie und tiefe Kopie unterteilt, unabhängig davon, ob der Parameter ein Basistyp oder ein Referenztyp ist Wenn super.clone() direkt aufgerufen wird, zeigt der resultierende Referenztyp immer noch auf denselben Speicher. Deep Copy bedeutet, dass nach dem Aufruf von super.clone() auch die Funktion clone() des Referenzparameters aufgerufen werden muss , um eine tiefe Kopie zu erreichen.
Flache Kopie:
(1) Grundlegender Datentyp
(String ) Wird ein neues Objekt kopiert? (2) Das Referenzobjekt verweist immer noch auf dasselbe Objekt.
Beispielcode für flache Kopie:
Das Endergebnis ist:public class Info { public int idnumber; public int getIdnumber() { return idnumber; } public void setIdnumber(int idnumber) { this.idnumber = idnumber; } } public class Person implements Cloneable{ private int age; private String nameString; public Info info; public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public String toString() { return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber; } public Object clone() { Person person=null; try { person=(Person)super.clone(); //浅拷贝 //person.info=(Info)info.clone(); } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return person; } } public class Hello { public static void main(String[] args) { // TODO 自动生成的方法存根 Info info=new Info(); info.setIdnumber(100); Person person1=new Person(); person1.setAge(10); person1.setNameString("tiantian"); person1.info=info; Person person2=(Person)person1.clone(); person2.setNameString("hello"); person2.setAge(20); person2.info.setIdnumber(200); System.out.println("person2"+person2); System.out.println("person1"+person1); } }Der Name und das Alter der Grundtypen von Person1 und Person2 haben sich geändert. Der ID-Wert des Referenztyps hat sich jedoch nicht geändert. Tiefe Kopie:
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber200
(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。
深拷贝代码示例:
public class Info implements Cloneable {//Info也进行拷贝 public int idnumber; public int getIdnumber() { return idnumber; } public void setIdnumber(int idnumber) { this.idnumber = idnumber; } public Object clone() { Info info=null; try { info=(Info)super.clone(); } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return info; } } public class Person implements Cloneable{ private int age; private String nameString; public Info info; public Info getInfo() { return info; } public void setInfo(Info info) { this.info = info; } public Person() { // TODO 自动生成的构造函数存根 } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public String toString() { return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber; } public Object clone() { Person person=null; try { person=(Person)super.clone(); //浅拷贝 person.info=(Info)info.clone();//加上这一句就变成了深拷贝,对对象引用也进行一次拷贝 } catch (CloneNotSupportedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return person; } }
结果:
person2name:hello,age:20,idnumber200 person1name:tiantian,age:10,idnumber100
所有的值都进行了改变。
Das obige ist der detaillierte Inhalt vonZusammenfassung der Java-Clone-Codebeispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!