Maison  >  Article  >  Java  >  Décrire brièvement la méthode clone() impliquée dans le clonage superficiel et le clonage profond en Java

Décrire brièvement la méthode clone() impliquée dans le clonage superficiel et le clonage profond en Java

Y2J
Y2Joriginal
2017-05-04 10:11:072206parcourir

Le clone Java (Clone) est l'une des fonctionnalités du langage Java. Cet article présente principalement le fonctionnement du mécanisme Clone en Java. Les amis qui en ont besoin peuvent s'y référer

Désormais, Clone n'est plus un. nouveauté Le mot, avec l'émergence de "Dolly", ce mot est effectivement "populaire". Au bout d'un moment, il existe aussi un tel concept en Java, qui nous permet de "créer" facilement un objet . Allez, regardons de plus près comment fonctionne le mécanisme Clone en Java ?

1. Clone&Copy

Supposons qu'il y ait maintenant un objet Employee, Employee tobby =new Employee("CMTobby",5000), généralement
nous aurons une telle affectation Employee cindyelf=tobby, ceci À ce moment-là, j'ai simplement copié la référence. Cindyelf et Tobby pointaient tous deux vers le même objet dans la mémoire, donc une opération de Cindyelf ou Tobby peut affecter l'autre partie.

Par exemple, si nous modifions la valeur du champ salaire via la méthode cindyelf.raiseSalary(), alors ce que Tobby obtient via la méthode getSalary() est la valeur modifiée du champ salaire. Évidemment, ce n'est pas le cas. ce que nous voulons voir. Arrivé. Nous espérons obtenir une copie exacte de Tobby sans nous affecter les uns les autres. Pour le moment, nous pouvons utiliser Clone pour répondre à nos besoins.

Employee cindy=tobby.clone(), un nouvel objet Employee sera généré et aura les mêmes attributs valeurs et méthodes que tobby.

2. Shallow Clone et Deep Clone

Comment se fait le clonage ? L'objet ne sait rien d'un objet lorsqu'il implémente Clone. Il effectue simplement une copie de domaine à domaine. Il s'agit de Shallow Clone.

De cette façon, le problème se pose. Prenons l'exemple de Employee. Il y a un champ HireDay dedans. Ce n'est pas une variable de type de base , mais une variable de référence, qui sera. généré après Clone. Une nouvelle référence de type Date pointe vers le même objet Date que le champ correspondant dans l'objet d'origine, de cette manière, la classe clonée partage une partie des informations avec la classe d'origine, et c'est le cas. évidemment désavantageux. Dans le processus Comme le montre l'image :

À ce stade, nous devons cloner en profondeur et effectuer un traitement spécial sur ces types de champs non basiques, tels que HireDay dans cet exemple. Nous pouvons redéfinir la méthode Clone et effectuer un traitement spécial le HireDay, comme indiqué dans le code suivant :

 class Employee implements Cloneable 
{ 
  public Object clone() throws CloneNotSupportedException 
  { 
   Employee cloned = (Employee) super.clone(); 
  cloned.hireDay = (Date) hireDay.clone() 
  return cloned; 
  } 
}

3. Mécanisme de protection de la méthode Clone()

Clone() est déclaré comme protégé dans Object. Cela a du sens. Prenez la classe Employee

en la déclarant comme protégée. , vous pouvez vous assurer que seule la classe Employee peut "cloner" l'objet Employee Pour le principe, vous pouvez vous référer à mes notes d'étude précédentes sur public, protégé et privé.

4. Utilisation de la méthode Clone()

L'utilisation de la méthode Clone() est relativement simple, il suffit de faire attention aux points suivants :

a. Quand utiliser le clone superficiel et quand utiliser le clone profond, cela dépend principalement de la nature du domaine de l'objet spécifique. Le type de base est toujours la variable de référence

b. La classe à laquelle appartient l'objet appelant la méthode Clone() doit implémenter Clonable

interface, sinon CloneNotSupportedException sera levée lorsque la méthode Clone est appelée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn