Maison  >  Article  >  Java  >  Comment utiliser la copie profonde Java, la copie superficielle et l'interface clonable

Comment utiliser la copie profonde Java, la copie superficielle et l'interface clonable

PHPz
PHPzavant
2023-04-28 20:31:051303parcourir

1. Introduction à l'interface Cloneable

Cloneable est une interface balisée (interface vide). Ils n'ont pas de méthodes ni de propriétés internes implémentent Cloneable pour indiquer que l'objet peut être cloné, et vous pouvez utiliser Object.clone(). méthode. Si un objet de classe qui n'implémente pas Cloneable appelle clone(), une CloneNotSupportedException sera levée.

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

On peut comprendre que l'interface Cloneable joue une fonction de marquage. Les types personnalisés obligent les utilisateurs à marquer quelles classes peuvent être clonées. Cette marque sert à implémenter l'interface Cloneable, elle indique que la classe. est créé. Les objets peuvent être clonés.

Si vous souhaitez qu'une classe ait pour fonction de copier des instances, en plus d'implémenter l'interface Cloneable, vous devez également remplacer la méthode clone() de la classe Object.

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

Vous pouvez voir que la méthode clone() de la classe Object est modifiée par protected, vous devez donc appeler la méthode clone() dans la classe Object via le super mot-clé dans la méthode clone() remplacée

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

2. Introduction et exemples de copie superficielle

Lors de la copie d'un objet, les variables membres du type de données de base de l'objet sont copiées, mais les variables membres du type référence ne sont transférées que par référence et aucun nouvel objet n'est créé. Lorsque le contenu du type référence est modifié, cela affectera l'objet copié. En bref : La copie superficielle copie uniquement l'objet copié, pas l'objet auquel il fait référence.

Observez le code suivant, utilisez l'instance de la classe Money comme champ de la classe Person, créez un nouvel objet de la classe Person, person1, et copiez cet objet person1 dans person2. La copie ici est une copie superficielle, copiez simplement l'objet person1. La référence monétaire est copiée dans person2, et momey dans person1 et person2 pointent vers le même objet.

class Money {
    public double m = 666;
}
class Person implements Cloneable{
    int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class TestDemo3 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通过person2修改前的结果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通过person2修改后的结果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

Résultat de l'exécution :

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

Illustration de copie superficielle :

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

3. Introduction et exemples de copie profonde

Lors de la copie d'un objet, en plus de copier les variables membres du type de données de base, la référence type Lors de la copie des variables membres, un nouvel objet est créé pour enregistrer les variables membres du type référence. En bref : Deep copy copie tous les objets référencés par l'objet à copier.

Le code suivant implémente la copie approfondie ; pour implémenter la copie approfondie de l'objet person1, utilisez d'abord la référence Person tmp pour enregistrer le résultat de la copie superficielle, recherchez l'objet monétaire via la référence tmp, puis copiez l'objet monétaire, puis attribuez-le à tmp money, et enfin revenir à tmp. De cette façon, l'objet référencé par money est également copié, réalisant une copie profonde. À ce moment-là, momey dans person1 et person2 pointent vers deux objets différents.

class Money implements Cloneable{
    public double m = 666;

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

}

class Person implements Cloneable{
    public int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //return super.clone();
        Person tmp = (Person) super.clone();
        tmp.money = (Money) this.money.clone();
        return tmp;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通过person2修改前的结果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通过person2修改后的结果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

Résultat de l'exécution :

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

Illustration de la copie approfondie :

Comment utiliser la copie profonde Java, la copie superficielle et linterface clonable

4.Résumé de la méthode de clonage

La méthode de clonage en Java est une copie superficielle et le type de référence transmet toujours la référence. Nous pouvons implémenter la copie complète en continuant à appeler la méthode clone() et en implémentant à nouveau la méthode clone() sur la variable de type référence de l'objet.

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