Обмен технологиями

Пожалуйста, объясните разницу между глубоким копированием и поверхностным копированием в Java. Что такое анонимные внутренние классы в Java? Каковы сценарии его применения?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Пожалуйста, объясните разницу между глубоким копированием и поверхностным копированием в Java.

В Java Deep Copy и Shallow Copy — это два способа копирования объектов. Их поведение при копировании объектов существенно различается.

Мелкая копия

Неглубокое копирование означает создание нового объекта и последующее копирование нестатических полей текущего объекта в новый объект. Если поле имеет тип значения, то поле копируется побитно, если поле является ссылочным типом. ссылка копируется, но не объект, на который ссылается, не копируется. Следовательно, исходный объект и его копия относятся к одному и тому же объекту.

В Java этого можно достичь с помощьюCloneableИнтерфейс и переписываниеclone()Метод реализации поверхностного копирования.Objectв классеclone()Этот метод позволяет добиться мелкого копирования.

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();
}
}

В этом примереnums Является ссылочным типом.еслиOriginalОбъект копируется неглубоко, затемnumsи в исходном объектеnumsбудет указывать на тот же объект массива.

Глубокое копирование

Глубокая копия не только копирует сам объект, но также рекурсивно копирует все переменные-члены ссылочного типа, содержащиеся в объекте. Это означает, что копия и исходный объект не будут использовать общие переменные-члены ссылочного типа. Изменение любых переменных-членов одного объекта не повлияет на другой объект.

В Java реализация глубокого копирования часто требует написания кода вручную, чтобы гарантировать правильное копирование всех переменных-членов ссылочных типов.

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;
}
}

В этом примереnumsМассив также копируется, поэтому исходный объект и копия не являются общими.numsмножество.

Подведем итог

  • Мелкая копияКопируется сам объект и его нестатические поля, но объекты, на которые имеются ссылки, не копируются.
  • глубокая копияКопируется не только сам объект и его нестатические поля, но также рекурсивно копируются все переменные-члены ссылочных типов.

Выбор использования глубокого или поверхностного копирования зависит от конкретных сценариев и требований приложения.


Что такое анонимные внутренние классы в Java? Каковы сценарии его применения?