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

Eine kurze Analyse des Java-Klonens (Codebeispiel)

不言
Freigeben: 2019-03-12 15:36:41
nach vorne
2559 Leute haben es durchsucht

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();
    }
    //...省略其余代码
}
Nach dem Login kopieren

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

Flache Kopie

Jetzt gibt es die untergeordnete Klasse:

public class Child{
    //...省略其余代码
}
Nach dem Login kopieren

und die Personenklasse:

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

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());
    }
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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();;
    }
    //...省略其余代码
}
Nach dem Login kopieren

Ä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;
    }
     //...省略其余代码
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage