Heim  >  Artikel  >  Java  >  Eine kurze Analyse des Java-Klonens (Codebeispiel)

Eine kurze Analyse des Java-Klonens (Codebeispiel)

不言
不言nach vorne
2019-03-12 15:36:412518Durchsuche

Dieser Artikel enthält eine kurze Analyse des Java-Klonens (Codebeispiele), die einen gewissen Referenzwert hat. Ich hoffe, dass er für Sie hilfreich ist.

Was ist Tiefe? Nur ein Abschluss.

Klonen: Erstellen Sie eine Kopie von

Die geklonte Klasse implementiert die Cloneable-Schnittstelle, überschreibt die clone()-Methode und kehrt zum clone()-Aufruf der übergeordneten Klasse zurück.

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
    //...省略其余代码
}

Dann rufen Sie beim Klonen einfach clone() auf, was wir gerade behandelt haben.

Flache Kopie

Jetzt gibt es die untergeordnete Klasse:

public class Child{
    //...省略其余代码
}

und die Personenklasse:

public class Person implements Cloneable{
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}

Klonen Sie das Personenobjekt p1 und weisen Sie es p2 zu, dann gehen wir weiter Schauen Sie sich ihre toString()- und hashCode()-Ergebnisse an:

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("zhangsan",23);
        p1.setChild(new Child("xiaoming", 1););
        //克隆操作
        Person p2 = p1.clone();
        //打印看看
        System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode());
        System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode());
    }
}

Ausgabe:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733

Fazit: Die Werte der Mitglieder p1 und p2 sind gleich, aber es handelt sich um zwei verschiedene Objekte. Ihre untergeordneten Mitglieder sind dasselbe Objekt.

Kopieren Sie

tief in Child, implementieren Sie die klonbare Schnittstelle und überschreiben Sie clone():

public class Child implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();;
    }
    //...省略其余代码
}

Ändern Sie dann das Person des clone() Klassenimplementierung:

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.setChild((Child)child.clone());
        return p;
    }
     //...省略其余代码
}

und dann das obige main(String [] args) aufrufen, das Ergebnis ist:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170

Fazit: p1, p2 sind zwei verschiedene Objekte und ihre untergeordneten Mitglieder sind ebenfalls zwei verschiedene Objekt.

Zusammenfassung

Klonen bedeutet, eine Kopie zu erstellen.

Beim flachen Kopieren wird einfach der Wert kopiert. Wenn Referenzmitglieder vorhanden sind, handelt es sich bei deren Referenzmitgliedern um dasselbe Objekt.

Warum?

Man kann meinen, dass derjenige, der clone() aufruft, eine tiefe Kopie dieser Person ist.

Im obigen Beispiel für flache Kopien sind p1 und p2 zwei verschiedene Objekte (tiefe Kopien von p1 und p2 selbst), da clone() des p1-Objekts aufgerufen wird clone() von p1, ruft aber auch clone() des Child-Typ-Objekts auf, sodass die beiden Child-Typ-Objekte unterschiedlich sind (tiefe Kopie aller Objekte).


Das obige ist der detaillierte Inhalt vonEine kurze Analyse des Java-Klonens (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen