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

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

不言
Libérer: 2019-03-12 15:36:41
avant
2559 Les gens l'ont consulté

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();
    }
    //...省略其余代码
}
Copier après la connexion

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

Copie superficielle

Maintenant, il y a la classe Enfant :

public class Child{
    //...省略其余代码
}
Copier après la connexion

et la classe Personne :

public class Person implements Cloneable{
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}
Copier après la connexion

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());
    }
}
Copier après la connexion

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
Copier après la connexion

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();;
    }
    //...省略其余代码
}
Copier après la connexion

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;
    }
     //...省略其余代码
}
Copier après la connexion
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
Copier après la connexion
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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal