Maison  >  Article  >  Java  >  Analyse complète de la méthode de clonage de l'objet Java

Analyse complète de la méthode de clonage de l'objet Java

高洛峰
高洛峰original
2017-01-17 16:52:301354parcourir

1 objet natif protégé clone() lève CloneNotSupportedException ;

1 La méthode est modifiée par le mot-clé natif

Le mot-clé natif en java indique que cette méthode est une méthode locale, [. Description native Java 】. De plus, l’efficacité d’exécution des méthodes modifiées natives est supérieure à celle des méthodes modifiées non natives.

2. La méthode est modifiée par protected

Lorsqu'une classe remplace la méthode clone(), elle doit être modifiée en modificateur d'accès public pour garantir que toutes les autres classes peuvent accéder à cette classe. . méthode.

3. La méthode lance CloneNotSupportedException

Une classe qui souhaite remplacer la méthode clone() doit implémenter l'interface java.lang.Cloneable elle-même, sinon une CloneNotSupportedException sera levée.

2. Le rôle de clone()

Remarque : Les objets ici font spécifiquement référence à des types complexes.

1. Simple = opération

Nous savons que les objets de type complexe en Java sont des types de référence, et ils stockent souvent l'adresse mémoire de l'objet. Par conséquent, nous ne pouvons pas simplement utiliser des opérations d’affectation simples comme l’opérateur =. Lorsque nous attribuons un objet a à un autre objet b, nous attribuons simplement l'adresse mémoire de l'objet a à b, de sorte que les deux objets pointent vers la même adresse mémoire. La conséquence est que les modifications apportées à un objet affecteront l’autre objet. Comme le montre la figure ci-dessous :

Person p1 = new Person();
Person p2 = p1;

java object 之clone方法全面解析

2. clone()

Utilisez la méthode clone() pour rapidement créez une copie A de l'objet et les deux objets pointent vers des adresses mémoire différentes. Comme le montre la figure ci-dessous :

Person p1 = new Person();
Person p2 = p1.clone();

java object 之clone方法全面解析

3. Clone peu profond et clone profond1, clone peu profond (copie superficielle)

clone superficiel Il fait référence uniquement à l'objet clone lui-même, pas aux champs de l'objet clone. Appelez simplement super.clone(), juste un clone superficiel. Bien que l'objet copié pointe vers une adresse mémoire différente, les champs de l'objet pointent toujours vers la même adresse mémoire que l'objet précédent.

public class ShallowClone implements Cloneable {
 
  public String name;
  public int age;
  public Person person;
 
  public ShallowClone() {
  }
 
  public ShallowClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }
 
  @Override
  public ShallowClone clone() {
    ShallowClone c = null;
    try {
      c = (ShallowClone) super.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }
 
  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;
 
    ShallowClone c1 = new ShallowClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    ShallowClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

Exécutez la sortie main() :

before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.Person@2dcb25f1

Explication de la copie superficielle, l'adresse mémoire de l'objet ShallowClone a changé, mais dans l'objet L'adresse mémoire du champ Personne n'a pas changé ;

2. Clonage profond (copie profonde)

Le clonage profond fait référence au clonage des champs de l'objet tout en clonant l'objet lui-même.

/**
 * deep clone代码示例
 * Created by CreGu on 2016/6/9.
 */
public class DeepClone implements Cloneable {
  public String name;
  public int age;
  public Person person;
 
  public DeepClone() {
  }
 
  public DeepClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }
 
  @Override
  public DeepClone clone() {
    DeepClone c = null;
    try {
      c = (DeepClone) super.clone();
      c.person = person.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }
 
  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;
 
    DeepClone c1 = new DeepClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    DeepClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

Exécuter la sortie main() :

before clone: c1 = cre.sample.test.object.DeepClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.DeepClone@742808b3, c2.person = cre.sample.test.Person@70535b58

Explication de la copie profonde, mémoire d'objet DeepClone L'adresse a changé, mais l'adresse mémoire du champ Personne dans l'objet a également changé.

L'analyse complète ci-dessus de la méthode de clonage de l'objet Java est tout le contenu partagé par l'éditeur. J'espère qu'elle pourra vous donner une référence et j'espère que vous soutiendrez le site Web PHP chinois.

Pour une analyse plus complète de la méthode de clonage de l'objet Java et des articles connexes, veuillez faire attention au site Web PHP chinois !

Déclaration:
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