Les bases de la pratique des entretiens - Clonage profond et clonage superficiel


avant-propos

Interviewez trois questions consécutives : 1. Savez-vous ce qu'est un clone profond et un clone superficiel ? 2. Comment le clonage profond est-il réalisé ? 3. Pourquoi utiliser le clone profond ? Il y a beaucoup de gens qui savent ce que c'est mais ne savent pas comment l'implémenter ? La raison pour laquelle le clone profond est utilisé n'est pas claire. Ensuite, entrons dans l'étude du clone profond et du clone superficiel, et suspendons l'intervieweur dès que possible !


1. Que sont les clones profonds et les clones superficiels ?

  1. Clone profond : copiez l'objet lui-même, mais copiez également tous les objets pointés par les références contenues dans l'objet
  2. Clone superficiel : lors de la copie d'un objet, seul l'objet lui-même (y compris les variables de base de l'objet) est copié et l'objet pointé par la référence contenue dans l'objet n'est pas copié.

insérez la description de l'image iciinsérez la description de l'image ici

2. Comment cloner

2.1 Clone peu profond

  1. L'objet implémente l'interface Cloneable
  2. Remplacer la méthode clone de la classe parent
  3. Ajouter super.clone dans la méthode de clonage

Le code est le suivant (exemple) :

public class Person implements Cloneable,Serializable{
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name;


    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person age:"+age+" name:"+name;
    }

    public static void main(String[] args) throws Exception{
        Person p = new Person(20,"李四");
        Person p1 = (Person) p.clone();
        p1.setAge(21);
        System.out.println(p.toString());
        System.out.println(p1.toString());
    }
}
复制代码

Ce qui précède n'implémente que le clonage superficiel. Pour le clonage en profondeur, la classe clonée et la classe correspondant à tous les attributs des types de données non basiques de la classe sont également implémentées.

2.2 Clone profond

Le code est le suivant (exemple) :

public class Person implements Cloneable,,Serializable{
    private int age;
    private String name;
    private Student student;
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public Person(int age,String name){
        this.age = age;
        this.name = name;
    }


    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person) super.clone();
        p.setStudent((Student) p.getStudent().clone());
        return  p;
    }

    @Override
    public String toString() {
        return "Person age:"+age+" name:"+name+ " "+student.toString();
    }

    public static void main(String[] args) throws Exception{
        Student s = new Student();
        s.setAge(11);
        s.setName("lengj");
        Person p = new Person(20,"李四");
        p.setStudent(s);
        Person p1 = (Person) p.clone();
        p1.setAge(22);
        p1.setName("张三");
        Student s1 = new Student();
        s1.setAge(12);
        s1.setName("kdd");
        p1.setStudent(s1);
        System.out.println(p.toString());
        System.out.println(p1.toString());
    }
}
复制代码
public class Student implements Cloneable,Serializable{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Student["+age+": name:"+name+"]";
    }

复制代码

insérez la description de l'image ici


3. Pourquoi utiliser le clonage profond

L'objet cloné peut contenir certaines propriétés qui ont été modifiées, en conservant la valeur de l'objet que vous souhaitez cloner, et les propriétés du nouvel objet sont toutes de nouveaux objets, et les propriétés correspondantes n'ont aucune valeur, nous devons donc réaffecter cet objet. . Autrement dit, lorsqu'un nouvel objet est nécessaire pour enregistrer "l'état" de l'objet actuel, la méthode clone est utilisée.

Je suppose que tu aimes

Origine juejin.im/post/7085289558232793096
conseillé
Classement