English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
protected Object clone() throws CloneNotSupportedException
possiamo usareclone()
due modi per implementare questo metodo
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.
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!
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.
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! 欢迎使用