моя контактная информация
Почтамезофия@protonmail.com
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? Каковы сценарии его применения?