le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Spiega la differenza tra copia profonda e copia superficiale in Java.
In Java, Deep Copy e Shallow Copy sono due modi per copiare oggetti. I loro comportamenti durante la copia di oggetti sono essenzialmente diversi.
La copia superficiale si riferisce alla creazione di un nuovo oggetto e quindi alla copia dei campi non statici dell'oggetto corrente nel nuovo oggetto. Se il campo è un tipo di valore, il campo viene copiato bit per bit; il riferimento viene copiato ma non L'oggetto referenziato non viene copiato. Pertanto, l'oggetto originale e la sua copia si riferiscono allo stesso oggetto.
In Java, ciò può essere ottenuto tramiteCloneable
Interfaccia e riscritturaclone()
Metodo per implementare la copia superficiale.Object
in classeclone()
Questo metodo può ottenere una copia superficiale.
class Original implements Cloneable { | |
private int[] nums; | |
public Original() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
public Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
} |
In questo esempio,nums
è un tipo di riferimento.SeOriginal
L'oggetto viene copiato superficialmente, quindi ilnums
e nell'oggetto originalenums
punterà allo stesso oggetto dell'array.
Una copia approfondita non solo copia l'oggetto stesso, ma copia anche in modo ricorsivo tutte le variabili membro del tipo riferimento contenute nell'oggetto, il che significa che la copia e l'oggetto originale non condivideranno alcuna variabile membro del tipo riferimento. La modifica di qualsiasi variabile membro di un oggetto non influirà su un altro oggetto.
In Java, l'implementazione di copie profonde spesso richiede la scrittura manuale del codice per garantire che tutte le variabili membro dei tipi di riferimento vengano copiate in modo appropriato.
class DeepCopied implements Cloneable { | |
private int[] nums; | |
public DeepCopied() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
@Override | |
public Object clone() throws CloneNotSupportedException { | |
DeepCopied copied = (DeepCopied) super.clone(); | |
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝 | |
return copied; | |
} | |
} |
In questo esempio,nums
Anche l'array viene copiato, quindi l'oggetto originale e la copia non vengono condivisinums
vettore.
La scelta di utilizzare la copia approfondita o la copia superficiale dipende dagli scenari e dai requisiti dell'applicazione specifica.
Cosa sono le classi interne anonime in Java? Quali sono i suoi scenari applicativi?