2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Veuillez expliquer la différence entre la copie approfondie et la copie superficielle en Java.
En Java, Deep Copy et Shallow Copy sont deux manières de copier des objets. Leurs comportements lors de la copie d'objets sont essentiellement différents.
La copie superficielle fait référence à la création d'un nouvel objet, puis à la copie des champs non statiques de l'objet actuel vers le nouvel objet. Si le champ est un type valeur, alors le champ est copié petit à petit si le champ est un type référence. la référence est copiée mais pas L'objet référencé n'est pas copié. L’objet original et sa copie font donc référence au même objet.
En Java, cela peut être réalisé parCloneable
Interface et réécritureclone()
Méthode pour implémenter une copie superficielle.Object
en classeclone()
Cette méthode permet d'obtenir une copie superficielle.
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(); | |
} | |
} |
Dans cet exemple,nums
Est un type de référence.siOriginal
L'objet est copié superficiellement, puis lenums
et dans l'objet originalnums
pointera vers le même objet tableau.
Une copie complète copie non seulement l'objet lui-même, mais copie également de manière récursive toutes les variables membres de type référence contenues dans l'objet, ce qui signifie que la copie et l'objet d'origine ne partageront aucune variable membre de type référence. La modification des variables membres d'un objet n'affectera pas un autre objet.
En Java, l'implémentation de copies complètes nécessite souvent l'écriture manuelle de code pour garantir que toutes les variables membres des types référence sont copiées de manière appropriée.
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; | |
} | |
} |
Dans cet exemple,nums
Le tableau est également copié, donc l'objet original et la copie ne sont pas partagésnums
tableau.
Le choix d’utiliser une copie approfondie ou une copie superficielle dépend des scénarios et des exigences spécifiques de l’application.
Que sont les classes internes anonymes en Java ? Quels sont ses scénarios d’application ?