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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top