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

Comment utiliser la copie superficielle Java

PHPz
Libérer: 2023-05-02 15:01:06
avant
1629 Les gens l'ont consulté

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

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:yisu.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