Maison >Java >javaDidacticiel >Quelle est l'importance de la méthode clone() en Java ?
La méthode
clone() est utilisée pour créer une copie d'un objet d'une classe qui implémente l'interface Cloneable. Par défaut, il copie champ par champ car la classe Object ne connaît pas les membres de la classe spécifique dont l'objet appelle cette méthode. Ainsi, si la classe n'a que des membres de type de données primitifs, une nouvelle copie de l'objet sera créée et une référence à la nouvelle copie de l'objet sera renvoyée. Toutefois, si la classe contient des membres de n'importe quel type de classe, seules les références d'objet à ces membres sont copiées, de sorte que les références de membre dans les objets d'origine et clonés font référence au même objet.
Si nous essayons d'appeler la méthode clone() sur un objet d'une classe qui n'implémente pas l'interface Cloneable , nous recevrons une CloneNotSupportedException . L'interface est une interface balisée, dont l'implémentation indique simplement que la méthode Object.clone() peut être appelée sur un objet de la classe implémentante.
<strong>protected Object clone() throws CloneNotSupportedException</strong>
Nous pouvons implémenter la méthode clone() de deux manières
C'est le résultat de la fonctionnalité de clonage par défaut fournie par la méthode Object.clone() (si la classe a également des membres du type de données de base). Dans le cas d'une copie superficielle, l'objet cloné fait également référence au même objet auquel l'objet d'origine fait référence, car seule la référence de l'objet est copiée et non l'objet référencé.
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("Tutorialspoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
Welcome to Tutorialspoint! Welcome to Tutorialspoint!
Nous devons remplacer le membre de la méthode clone() pour les classes de types non basiques afin d'implémenter deep copy, car il doit également cloner le objet membre, le mécanisme de clonage par défaut ne fait pas cela.
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" TutorialsPoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
Welcome to TutorialsPoint! Welcome to
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!