Maison  >  Article  >  Java  >  Quelle est l’importance de la méthode clone() en Java ?

Quelle est l’importance de la méthode clone() en Java ?

王林
王林avant
2023-09-14 14:25:02825parcourir

La méthode

Quelle est l’importance de la méthode clone() en Java ?

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.

Syntaxe

<strong>protected Object clone() throws CloneNotSupportedException</strong>

Nous pouvons implémenter la méthode clone() de deux manières

Copie superficielle

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é.

Exemple

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;
   }
}

Output

Welcome to Tutorialspoint!
Welcome to Tutorialspoint!

Deep copy

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.

Exemple

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;
   }
}

Sortie

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer