2012-11-22 1 views
2

Je lis this après aujourd'hui sur la copie profonde et avait quelques questions:ArrayLists Modification dans une méthode et passe par la valeur

Dans le premier code, l'auteur dit en ajoutant un (entier) objet à un clone ne semble pas dans la version originale. Pourquoi cela est-il ainsi? Si je comprends bien, le clonage crée essentiellement un objet avec les mêmes références aux objets que l'original.

Pourquoi le clone n'est-il pas modifié dans l'original?

Est-ce que cloner ne partage pas la même référence que l'original?

+0

Vous avez mal compris le clone. Il y aura un nouvel objet une fois qu'un objet est cloné. Ce sont des objets différents donc vous changez sur B n'affecte jamais A.Cependant, dans un clone peu profond, certains membres seront partagés sur les deux objets car les références à ces membres sont également clonées. –

+0

Donc, si j'ajoute un objet de classe à l'original, il ne devrait pas apparaître dans le clone et vice versa? – Floose

Répondre

3

Lorsque vous clonez un Object 'A', vous créez un nouveau Object 'B' (avec les mêmes références aux objets) mais dans une adresse de mémoire différente. Ainsi, lorsque vous modifiez l'objet 'A', vous n'accédez pas à la même adresse mémoire du Object 'B'. Par conséquent, le changement dans le clone ne se reflète pas dans l'original et vice versa.

copie superficielle

clone général méthode d'un objet, crée une nouvelle instance de la même classe et copie tous les champs à la nouvelle instance et le renvoie. Ce n'est rien d'autre qu'une copie superficielle. La classe Object fournit une méthode clone et fournit un support pour la copie superficielle. Il renvoie 'Object' comme type et vous devez renvoyer explicitement à votre objet d'origine.

profonde Copie

Lorsque vous avez besoin d'une copie en profondeur, vous devez implémenter vous-même. Lorsque l'objet copié contient un autre objet, ses références sont copiées récursivement en copie profonde. Lorsque vous implémentez une copie en profondeur, faites attention aux dépendances cycliques. Si vous ne voulez pas implémenter une copie profonde, vous pouvez opter pour la sérialisation. Il implémente une copie profonde implicitement et gère avec élégance les dépendances cycliques.

Voici un exemple illustratif:

peu profond

Before Copy Shallow Copying Shallow Done

profonde:

Before Copy Deep Copying Deep Done

4

Tout le but d'un clone est d'être différent que l'original - donc les changements dans le clone ne sont pas reflété dans l'original. Sinon, vous pourriez simplement utiliser l'assignation simple plutôt que le clonage.

par exemple.

MyClass a = new MyClass(); // some cloneable class 

MyClass b = a; // not a clone, changes to `b` will affect in `a` 
       // assignment duplicates the reference 
    -or- 

MyClass b = a.clone(); // clone, changes to `b` will not affect in `a` 
         // clone duplicates the object 

Il est en fait un article de Wikipedia sur le clonage Java here.

Questions connexes