Maison  >  Article  >  Java  >  Résumé des exemples de code de clone Java

Résumé des exemples de code de clone Java

黄舟
黄舟original
2017-03-15 11:44:151483parcourir

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);
}
}
Le nom et l'âge des types de base de personne1 et personne2 ont changé, Mais la valeur idnumber du type référence n’a pas changé.

Copie approfondie :
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn