Maison >Java >javaDidacticiel >Comment utiliser la copie superficielle Java

Comment utiliser la copie superficielle Java

PHPz
PHPzavant
2023-05-02 15:01:061626parcourir

1. Concept

Une copie superficielle créera un nouvel objet. Le nouvel objet n'a aucune relation avec l'objet d'origine lui-même Le nouvel objet n'est pas le même que l'objet d'origine, mais les propriétés du nouvel objet sont les mêmes. identique à l'ancien objet. Plus précisément, vous pouvez voir les différences suivantes :

(1) Si l'attribut est un type de base (int, double, long, booléen, etc.), la valeur du type de base est copiée

(2) Si le L'attribut est un type de référence, la mémoire est une adresse copiée (c'est-à-dire copier la référence mais pas l'objet référencé), donc si l'un des objets change d'adresse, cela affectera l'autre objet.

2.Principe

Si la variable membre de l'objet prototype est de type valeur, une copie sera copiée dans l'objet clone, ce qui signifie qu'elle a un espace indépendant dans le tas si la variable membre du prototype ; L'objet est un type référence, ce sera L'adresse de l'objet de référence est copiée dans l'objet clone, ce qui signifie que les variables membres de l'objet prototype et de l'objet clone pointent vers la même adresse mémoire. En d'autres termes, dans le clonage superficiel, lorsqu'un objet est copié, seuls lui-même et les variables membres du type valeur qu'il contient sont copiés, tandis que les objets membres du type référence ne sont pas copiés.

3. Utilisez l'instance

implémentez l'interface Cloneable sur la classe qui doit être copiée et remplacez sa méthode clone()

class Father{
    String name;
    public Father(String name) {
        this.name=name;
    }
    @Override
    public String toString() {
        return "Father{" +
                "name='" + name + '\'' +
                '}';
    }
}
class Son implements Cloneable {
    int age;
    String name;
    Father father;
    public Son(String name,int age) {
        this.age=age;
        this.name = name;
    }
    public Son(String name,int age, Father father) {
        this.age=age;
        this.name = name;
        this.father = father;
    }
    @Override
    public String toString() {
        return "Son{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", father=" + father +
                '}';
    }
    @Override
    protected Son clone() throws CloneNotSupportedException {
        return (Son) super.clone();
    }
}
public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Father f=new Father("bigFather");
        Son s1 = new Son("son1",13);
        s1.father=f;
        Son s2 = s1.clone();
        
        System.out.println(s1);
        System.out.println(s2);
        System.out.println("s1==s2:"+(s1 == s2));//不相等
        System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//相等
        System.out.println();
 
        //但是他们的Father father 和String name的引用一样
        s1.age=12;
        s1.father.name="smallFather";//s1.father引用未变
        s1.name="son222";//类似 s1.name=new String("son222") 引用发生变化
        System.out.println("s1.Father==s2.Father:"+(s1.father == s2.father));//相等
        System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//不相等
        System.out.println(s1);
        System.out.println(s2);
    }
}

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