Maison  >  Article  >  Java  >  Une brève analyse du clonage Java (exemple de code)

Une brève analyse du clonage Java (exemple de code)

不言
不言avant
2019-03-12 15:36:412510parcourir

Le contenu de cet article est une brève analyse (exemple de code) sur le clonage Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Qu'est-ce que la profondeur ? Juste un diplôme.

Clone : ​​​​Faites une copie de

La classe clonée implémente l'interface Cloneable, remplace la méthode clone() et revient à l'appel de clone() de la classe parent.

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
    //...省略其余代码
}

Ensuite, lors du clonage, appelez simplement clone() que nous venons de couvrir.

Copie superficielle

Maintenant, il y a la classe Enfant :

public class Child{
    //...省略其余代码
}

et la classe Personne :

public class Person implements Cloneable{
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}

Clonez l'objet Personne p1 et attribuez-le à p2, Ensuite, nous regardons leurs résultats toString() et hashCode() :

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("zhangsan",23);
        p1.setChild(new Child("xiaoming", 1););
        //克隆操作
        Person p2 = p1.clone();
        //打印看看
        System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode());
        System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode());
    }
}

Sortie :

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733

Conclusion : Les valeurs des membres p1, p2 sont égales, mais ils sont deux Pour des objets différents, leurs membres Enfants sont le même objet.

Deep copy

implémente également l'interface Cloneable pour Child et remplace clone() :

public class Child implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();;
    }
    //...省略其余代码
}

Ensuite, changez la classe Person : clone()

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.setChild((Child)child.clone());
        return p;
    }
     //...省略其余代码
}
Ensuite appelez ce qui précède

, le résultat est : main(String [] args)

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170
Conclusion : p1, p2 sont deux objets différents, leurs membres enfants sont aussi deux objets différents.

Résumé

Le clonage consiste à faire une copie.

La copie superficielle consiste simplement à copier la valeur. S'il y a des membres de référence, leurs membres de référence seront le même objet. Ce n'est pas le cas avec la copie profonde.

Pourquoi ?

On peut penser que celui qui appelle clone() est une copie profonde de cette personne.

Dans l'exemple de copie superficielle ci-dessus, parce que clone() de l'objet p1 est appelé, p1 et p2 sont deux objets différents (des copies profondes de p1 et p2 eux-mêmes dans l'exemple de copie profonde, pas seulement des appels) ; clone() de p1, mais appelle également clone() de l'objet de type Child, donc les deux objets de type Child sont différents (copie complète de tous les objets).


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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer