Heim  >  Artikel  >  Java  >  Umfassende Analyse der Klonmethode von Java-Objekten

Umfassende Analyse der Klonmethode von Java-Objekten

高洛峰
高洛峰Original
2017-01-17 16:52:301359Durchsuche

1 protected native Object clone() löst CloneNotSupportedException aus;

1 Die Methode wird durch das native Schlüsselwort geändert

Das native Schlüsselwort in Java gibt an, dass es sich bei dieser Methode um eine lokale Methode handelt, [ Java-native Beschreibung 】. Darüber hinaus ist die Ausführungseffizienz nativer modifizierter Methoden höher als die von nicht nativen modifizierten Methoden.

2. Die Methode wird durch protected geändert.

Wenn eine Klasse die clone()-Methode überschreibt, muss sie in den öffentlichen Zugriffsmodifikator geändert werden, um sicherzustellen, dass alle anderen Klassen auf diese Klasse zugreifen können . Methode.

3. Die Methode löst eine CloneNotSupportedException aus

Eine Klasse, die die clone()-Methode überschreiben möchte, muss die java.lang.Cloneable-Schnittstelle selbst implementieren, andernfalls wird eine CloneNotSupportedException geworfen.

2. Die Rolle von clone()

Hinweis: Die Objekte hier beziehen sich speziell auf komplexe Typen.

1. Einfach = Operation

Wir wissen, dass komplexe Typobjekte in Java Referenztypen sind und häufig die Speicheradresse des Objekts speichern. Daher können wir nicht einfach einfache Zuweisungsoperationen wie den =-Operator verwenden. Wenn wir ein Objekt a einem anderen Objekt b zuweisen, weisen wir einfach die Speicheradresse von Objekt a zu b zu, sodass beide Objekte auf dieselbe Speicheradresse zeigen. Dies hat zur Folge, dass Änderungen an einem Objekt Auswirkungen auf das andere Objekt haben. Wie in der Abbildung unten gezeigt:

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

java object 之clone方法全面解析

2. clone()

Verwenden Sie die clone()-Methode, um schnell zu sein Erstellen Sie eine Kopie des Objekts, und die beiden Objekte verweisen auf unterschiedliche Speicheradressen. Wie in der Abbildung unten gezeigt:

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

java object 之clone方法全面解析

3. Flacher Klon und tiefer Klon1, flacher Klon (flache Kopie)

shallow clone Es bezieht sich nur auf das Klonobjekt selbst, nicht auf die Felder im Klonobjekt. Rufen Sie einfach super.clone() auf, nur einen flachen Klon. Obwohl das kopierte Objekt auf eine andere Speicheradresse zeigt, verweisen die Felder im Objekt immer noch auf dieselbe Speicheradresse wie das vorherige Objekt.

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);
  }
}

Ausgabe von main() ausführen:

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

Erklärung zur flachen Kopie, die Speicheradresse des ShallowClone-Objekts hat sich geändert, aber in das Objekt Die Speicheradresse des Personenfelds hat sich nicht geändert.

2. Deep Clone (tiefe Kopie)

Deep Clone bezieht sich auf das Klonen der Felder im Objekt, während das Objekt selbst geklont wird.

/**
 * 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);
  }
}

Ausgabe von main() ausführen:

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

Erklärung von Deep Copy, DeepClone-Objektspeicher Die Adresse hat sich geändert, aber auch die Speicheradresse des Personenfelds im Objekt hat sich geändert.

Die obige umfassende Analyse der Klonmethode von Java-Objekten ist der gesamte vom Herausgeber geteilte Inhalt. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie die chinesische PHP-Website unterstützen.

Eine umfassendere Analyse der Klonmethode von Java-Objekten und verwandte Artikel finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn