2014-12-01 4 views
10

Die clone Methode auf Object, die eine exakte Kopie eines Objekts erzeugt wird, erklärt, wie:Warum ist Object.clone() in Java nativ?

protected native Object clone() throws CloneNotSupportedException; 

Warum ist es native?

+3

Bitte unbold Ihre Frage. – Maroun

+7

Verwandte (Duplikat?): Http://Stackoverflow.com/a/557606/1225328 – sp00m

+0

@ sp00m, danke. – Aamir

Antwort

3

Grundsätzlich vermeiden, weil die clone() Methode tut etwas, was Sie nicht tun können, in der Sprache Java: Es klont den Zustand des Objekts, einschließlich seiner tatsächlichen Klassenbezeichnung.

Der Klonmechanismus in Java basiert auf jeder Klasse, die die clone-Methode der Superklasse aufruft, bis hin zu Object. Objekt verwendet dann diese "magische" native Methode clone, um das ursprüngliche Objekt einschließlich seiner tatsächlichen Klasse zu duplizieren.

Denken Sie daran:

class A implements Cloneable { 

    public A clone() { 

     A obj = (A) super.clone(); 

     // Do some deep-copying of fields 

     return obj; 
    } 

} 

class B extends A { 

    public B clone() { 

     B obj = (B) super.clone(); 

     // Do some deep-copying of fields not known to A 

     return obj; 

    } 
} 

Nun stell dir vor, dass Sie einen B Typ Objekt haben, und Sie clone auf es nennen. Sie erwarten, ein Objekt B zu erhalten, dessen Klasse intern als B, nicht als Object erkannt wird. B kennt nicht die Implementierung von allem in A, und daher muss A 's clone Methode aufgerufen werden. Aber wenn Aclone in der Sprache Java implementiert wurde, anstatt super.clone() aufzurufen, dann müsste das Objekt, das es zurückgeben würde, A sein. Es kann new B() nicht verwenden (angenommen, B war nicht bekannt, als A erstellt wurde).

Es könnte etwas mit Reflektion tun, aber woher sollte es wissen, welcher Konstruktor aufgerufen wird, damit alle endgültigen Felder richtig ausgefüllt werden?

Also der Trick ist, dass A es nicht selbst tut, nennt es super.clone(), und das geht den ganzen Weg zurück zu Object, und es verwendet eine native Methode, die eine Byte-für-Byte macht das Kopieren des ursprünglichen Objekts , Anpassung für den neuen Heapspeicherort. Somit wird das neue Objekt auf magische Weise zu einem Objekt und die Typumwandlung würde nicht fehlschlagen.

Warum nicht eine Object dann zurückgeben? Weil das nicht das Klonen wäre.Wenn Sie clone aufrufen, erwarten Sie, ein Objekt des gleichen Status (Felder) und derselben Klasse (überschriebene und hinzugefügte Methoden) zu erhalten. Wenn es ein Objekt zurückgab, dessen interne Klassenbezeichnung Object war, hätten Sie nur Zugriff auf Dinge, die Object bieten, wie toString(), und Sie wären nicht in der Lage, auf seine privaten Felder von einem anderen B Objekt zuzugreifen oder es einem zuzuweisen B Typ Variable.

+0

Object.clone macht eine seichte Kopie, keine tiefe Kopie – lbalazscs

+0

@Ibalazscs wahr, aber die Implementierungen davon innerhalb der Klassen des Benutzers müssen normalerweise das tiefe Kopieren selbst tun. Deshalb müssen sie es normalerweise überschreiben und es nicht einfach behalten, wie es ist. – RealSkeptic

-2

Es ist nativ, da einige Systemklassen Clone() in C++ geschrieben werden, um die Leistung zu verbessern.

+0

Wie beantwortet das die Frage? – Maroun

+0

Es ist der Grund, dass Ausnahme – Adem

+0

ausgelöst wird Lesen Sie die Frage erneut. – Maroun

5

Blick auf die Klon-Dokumentation:

Andernfalls erstellt diese Methode eine neue Instanz der Klasse dieses Objekt und initialisiert alle seine Felder mit genau den Inhalt der entsprechenden Feldern dieses Objekts, wie wenn durch Zuweisung; Der Inhalt der Felder wird nicht selbst geklont.

Diese Operation kann sehr effizient mit nativem Code durchgeführt werden, da einige Speicher direkt kopiert werden müssen. Es ist in dieser Hinsicht ähnlich zu System.arrayсopy, die auch nativ ist. Weitere Einzelheiten dieser Frage sehen: Is it possible to find the source for a Java native method?

Beachten Sie, dass in der Regel sollten Sie Object.clone(), und verwenden Sie zum Beispiel eine Kopie Konstruktor statt finden How do I copy an object in Java?

Verwandte Themen