Partage de technologie

Veuillez expliquer la différence entre la copie approfondie et la copie superficielle en Java. Que sont les classes internes anonymes en Java ? Quels sont ses scénarios d’application ?

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.

Copie superficielle

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é parCloneableInterface et réécritureclone()Méthode pour implémenter une copie superficielle.Objecten 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.siOriginalL'objet est copié superficiellement, puis lenumset dans l'objet originalnumspointera vers le même objet tableau.

Copie approfondie

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,numsLe tableau est également copié, donc l'objet original et la copie ne sont pas partagésnumstableau.

Résumer

  • Copie superficielleL'objet lui-même et ses champs non statiques sont copiés, mais les objets référencés ne sont pas copiés.
  • copie approfondieNon seulement l'objet lui-même et ses champs non statiques sont copiés, mais également toutes les variables membres des types référence sont copiées de manière récursive.

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 ?