Après l'avoir lu sur papier, je me rends compte que je dois le faire en détail
--Lu You Demandez au canal s'il est clair, afin qu'il y ait une source d'eau vive - Zhu Xi
cloner et Copier : Quand il y a un objetPersonne p1=nouveau Personne("nom",âge ; affecte l'autre partie. Lorsque le paramètre de la fonction est un objet, le type référence est passé et les opérations à l'intérieur de la fonction objet affecteront l'objet externe. Si vous souhaitez transférer une copie de l'objet, vous devez utiliser la méthode clone() de object. ) L'objet copie renvoie un nouvel objet, pas une référence ; la différence entre l'objet copie et le nouvel objet renvoyé par l'opérateur new est que cet objet copie contient déjà des informations de l'objet d'origine, plutôt que les informations initiales de l'objet. Quand utiliser shtoutow Clone (copie superficielle, copie fantôme) , quand utiliser deep Clone (copie profonde) : Cela dépend principalement de la nature de l'objet de domaine spécifique. S'il s'agit d'un type de base, utilisez un clone peu profond , s'il s'agit d'une référence La variable (référence variable) utilise Deep Clone. Étapes pour implémenter le clonage : (1) Implémentez l'interface Cloneable
n'a pas de méthodes abstraites, appelées interfaces de drapeau.
(2) Remplacez la méthode clone de la classe de base et déclarez-la comme publique (3) Remplacez la méthode clone dans la classe dérivée et appelez
super.clone ( )
Dans le clone, il est divisé en copie superficielle et copie profonde, ce qui signifie que le paramètre est un type de base ou un type de référence. , super.clone() est directement appelé Copy, le type de référence résultant pointe toujours vers la même mémoire ; la copie profonde signifie qu'après avoir appelé super.clone(), la fonction clone() du paramètre reference doit également être appelée pour copier. , pour obtenir une copie approfondie.
Copie superficielle :
(1) type de données de base
(Chaîne ) Un nouvel objet sera-t-il copié ? (2) L'objet de référence fait toujours référence au même objet.
Exemple de code en copie superficielle :
Le résultat final est :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); } }
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
所有的值都进行了改变。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!