Verwirrung über klonbar Schnittstelle und Object.clone () in Java
Frage
Wenn ich:
class foo implements Cloneable
und dann tun:
bar = new foo();
bar.clone();
Ich erhalte eine flache Kopie, ohne dass irgendeine bar.clone()
Code schreiben, wie ich normalerweise würde tun müssen, wenn ich eine Schnittstelle implementieren.
Mein Verständnis ist, dass ein Funktionen der Schnittstelle von der Klasse müssen deren Umsetzung ausgefüllt und Object.clone()
hat keine Implementierung (gemäß der Dokumentation „Die Klasse Object hat sich die Schnittstelle nicht implementieren klonbar“)
Also, wo mein flacher Klon her? Wo ist der Code, bar.clone()
implementiert, wenn Object.clone()
nicht implementiert? Ich bin verwirrt.
Lösung
Seien Sie sehr vorsichtig Klon verwenden. In der Tat würde ich es ganz vermeiden. Ich habe nie es brauchte. ABER ..., dass gesagt wird, ist die beste Diskussion des Themas ich je gelesen habe von Joshua Bloch ist, in Effective Java. Lesen Sie Artikel. 11: "außer Kraft setzen Klon umsichtig"
Bitte tun Sie sich einen Gefallen und das Element lesen. Ich empfehle wirklich, dass ganzes Kapitel (und den Rest des Buchs) zu lesen. Alles, was Sie über Klon wissen, und warum ich Sie warnen etwa ist es da drin.
Hope, das hilft.
Andere Tipps
Object.clone () hat eine Implementierung:
http: // java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone ()
Dieser Link erklärt die klonbar Schnittstelle: http://java.sun.com/j2se /1.5.0/docs/api/java/lang/Cloneable.html
Ein Objekt muss die klonbar Schnittstelle implementieren, um den Klon () Methode aufrufen, andernfalls es wirft einen CloneNotSupportedException.
Per Definition sind alle Klassen in Java erweitern die Basisobjektklasse und Objektklasse hat eine Standard-Methode clone (), obwohl Objekt selbst nicht klonbar implementieren. Die Klon der Klasse Object () -Methode aufgerufen wird, wenn Sie es selbst nicht außer Kraft setzen.
Wenn ich habe: „class foo Arbeitsgeräte klonbar "
und dann tun: bar = new foo (); bar.clone ();
Ich erhalte eine flache Kopie, ohne dass jeden bar.clone () Code wie ich zu schreiben normalerweise würde tun müssen, wenn ich implementieren eine Schnittstelle.
Das würde nur funktionieren, wenn Sie es innerhalb der Klasse „foo“ nennen, weil die .clone () -Methode von Object
geerbt ist geschützt.
Mein Verständnis ist, dass ein Schnittstelle Funktionen müssen ausgefüllt werden in der Klasse deren Umsetzung und Object.clone () hat keine Umsetzung (Stand der Dokumentation „Die Klasse Object nicht selbst das Gerät Schnittstelle Cloneable ")
(1) Object.clone()
hat eine Implementierung haben. Es macht eine flache Kopie des Objekts, wenn das Objekt Cloneable
implementiert. (2) Die .clone()
Methode ist nicht Teil einer Schnittstelle. (3) mit einem .clone()
Verfahren und Umsetzung der Cloneable
Schnittstelle sind völlig verschiedene Dinge. Sie müssen nur die Cloneable
Schnittstelle implementieren, wenn Sie die Verwendung von Object
der clone
Methode machen wollen; aber dies ist der empfohlene Weg, um eine clone
Methode für Ihre Klasse zu schreiben -. seine Kopie von der Superklasse der clone
Methode zu erhalten, die schließlich zu Object
des clone
Verfahren geht nach oben
Mein Verständnis ist, dass ein Funktionen der Schnittstelle von der Klasse müssen deren Umsetzung ausgefüllt und Object.clone () hat keine Implementierung (gemäß der Dokumentation „Die Object-Klasse hat sich die Schnittstelle Cloneable nicht implementieren“)
gibt es einen Unterschied zwischen sagen Object.clone () nicht implementiert und das Klassenobjekt nicht selbst implementieren die Schnittstelle Cloneable
Objekt des Klon-Methode funktioniert Implementierung haben, tut es Speicher-Kopie des Objekts, die Klon-Methode aufgerufen.
Sie haben Recht, Objektklasse nicht implementiert klonbar, alle es tut, ist zu überprüfen das Objekt klonbar oder nicht.
die obige Antwort Punkt des Sie ein Buch zu lesen, ich glaube, ich eine schnelle Lösung geben kann so Ihre Frage zu beantworten
Wo kommt mein flacher Klon her? Objekt Klon-Methode
Wo ist der Code, bar.clone implementiert (), wenn Object.clone () nicht implementiert? es hat Implementierung in nativen Code geschrieben.