Question

Si j'ai:

class foo implements Cloneable

puis faire:

bar = new foo();
bar.clone();

Je reçois une copie superficielle sans avoir besoin d'écrire du code comme je bar.clone() doivent normalement faire quand j'implémentent une interface.

Je crois comprendre que doivent être remplies par la classe des fonctions d'une interface mise en œuvre, et Object.clone() n'a pas d'implémentation (selon les docs, « L'objet de classe ne s'implémenter l'interface Cloneable »)

Alors, où vient mon clone peu profond de? Où est le code qui implémente si <=> n'a pas d'implémentation <=>? Je suis confus.

Était-ce utile?

La solution

Soyez très prudent à l'aide clone. En fait, je l'éviter complètement. J'ai jamais besoin. MAIS ... Cela étant dit, la meilleure discussion sur le sujet que j'ai jamais lu est par Joshua Bloch, dans Effective Java. Lire l'article 11:. "Remplacer clone judicieusement"

vous S'IL VOUS PLAÎT faire une faveur et de lire cet article. Je recommande la lecture en fait que tout le chapitre (et le reste du livre). Tout ce que vous devez savoir sur clone et pourquoi je vous mets en garde à ce sujet est là-dedans.

Hope this helps.

Autres conseils

Object.clone () a une mise en œuvre:

http: // java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone ()

Ce lien explique l'interface Cloneable: http://java.sun.com/j2se /1.5.0/docs/api/java/lang/Cloneable.html

Un objet doit implémenter l'interface Cloneable afin d'appeler la méthode clone (), sinon, il jette un CloneNotSupportedException.

Par définition, toutes les classes Java étendre la base de classe d'objets, et la classe d'objet a une méthode clone par défaut (), même si l'objet lui-même ne met pas en œuvre Cloneable. La méthode clone de la classe Object () sera appelée si vous ne le remplacez-vous.

  

Si j'ai: « classe implémente foo   cloneable "

     

puis faire: bar = new foo ();   bar.clone ();

     

Je reçois une copie superficielle sans avoir besoin   d'écrire un code bar.clone () comme je   devraient normalement faire quand je   implémenter une interface.

Cela ne fonctionnera que si vous appelez cela dans la classe « foo », parce que la méthode .clone () héritée de la protection est Object.

  

Si je comprends qu'un   Les fonctions d'interface doivent être remplies   par la classe mise en œuvre, et   Object.clone () n'a pas d'implémentation   (Selon les docs, « La classe Object   ne pas se mettre en œuvre la   Interface Cloneable ")

(1) n'ont une Object.clone() mise en œuvre. Il fait une copie superficielle de l'objet si l'objet implémente Cloneable. (2) La méthode .clone() ne fait pas partie d'une interface. (3) Avoir une méthode et la mise en œuvre du clone l'interface sont des choses complètement <=> séparées. Vous avez seulement besoin d'implémenter l'interface si vous avez l'intention <=> d'utiliser la méthode de <=> <=>; cependant, c'est la méthode recommandée pour écrire une méthode pour votre classe <=> -. pour obtenir sa copie de la méthode de superclasse de <=>, qui va éventuellement jusqu'à la méthode de <=> <=>

  

Je crois comprendre qu'il doit être rempli par la classe mise en œuvre, et Object.clone () n'a pas mise en œuvre (selon les docs, « L'objet de classe ne s'implémenter l'interface Cloneable »)

il y a une différence entre dire Object.clone () n'a pas d'implémentation et l'objet de classe ne se pas mettre en œuvre l'interface Cloneable

La méthode clone d'objet ne possède la mise en œuvre, il fait mémoire copie de l'objet qui a appelé méthode clone.

vous avez raison, la classe d'objet ne met pas en œuvre cloneable, tout ce qu'il fait est de vérifier l'objet est cloneable ou non.

le point de réponse ci-dessus de vous lire un livre, je pense que je peux donner une solution rapide Pour répondre à votre question

Alors, où est mon clone peu profond vient? La méthode clone de l'objet

Où est le code qui implémente bar.clone () si Object.clone () n'a pas d'implémentation?  il a la mise en œuvre, écrit en code natif.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top