English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java中clone()方法的重要性?

Ilclone() Il metodo viene utilizzato per creare una copia di un oggetto di una classe che ha implementatoCloneable Interfaccia. Di default,Copia per campo, Poiché la classe Object non ha alcuna conoscenza specifica dei membri di una classe che chiama questo metodo per l'oggetto, di conseguenza, se la classe ha solo membri di tipo dati primitivi, viene creata una nuova copia dell'oggetto e restituita una riferimento alla copia del nuovo oggetto. Tuttavia, se la classe contiene qualsiasi tipo di membro di classe, viene copiato solo il riferimento agli oggetti di quei membri, quindi i riferimenti ai membri negli oggetti originale e clonato si riferiscono allo stesso oggetto.

Se si tenta di implementare senzaCloneable Esegui un oggetto di classe su chiamataclone()metodo, allora otterraiCloneNotSupportedException . Questa interfaccia èinterfaccia di etichetta,e questointerfaccial'implementazione rappresenta solo che può essere chiamato sull'oggetto della classe di implementazioneObject.clone()metodo.

sintassi

protected Object clone() throws CloneNotSupportedException

possiamo usareclone()due modi per implementare questo metodo

copia superficiale

se la classe ha anche membri di tipo non primitivo, allora èObject.clone()il risultato della funzione di clonazione predefinita fornita dal metodo. Nel caso della "copia superficiale", l'oggetto clonato ancora riferisce agli oggetti che l'oggetto originale riferisce, perché viene copiato solo il riferimento all'oggetto, non l'oggetto stesso.

Esempio

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("w3codebox!");
      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;
   }
}

输出结果

欢迎使用w3codebox!
欢迎使用w3codebox!


copia profonda

per le classi con membri di tipo non primitivo, dobbiamo sovrascrivereclone() metodi per implementareDeep Copy,poiché deve anche clonare gli oggetti membri, e il meccanismo di clonazione predefinito non è in grado di farlo.

Esempio

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" w3codebox!");
      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;
   }
}

输出结果

欢迎使用w3codebox!
欢迎使用