Объясните разницу между поверхностным и глубоким копированием объектов.
Ответ от нейросети
sobes.tech AI
Поверхностное (shallow) и глубокое (deep) копирование объектов в Java отличаются тем, как копируются вложенные объекты:
-
Поверхностное копирование создает новый объект, но поля-ссылки внутри копируются как есть, то есть обе копии ссылаются на одни и те же вложенные объекты. Изменения вложенных объектов в одной копии будут видны и в другой.
-
Глубокое копирование создает новый объект и рекурсивно копирует все вложенные объекты, создавая полностью независимую копию со своей структурой.
В Java поверхностное копирование часто реализуется через метод clone(), который по умолчанию делает именно поверхностное копирование. Для глубокого копирования нужно самостоятельно реализовать копирование вложенных объектов.
Пример поверхностного копирования:
class Person implements Cloneable {
String name;
Address address; // Address - отдельный класс
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone(); // поверхностное копирование
}
}
Если изменить address в клоне, это повлияет на оригинал, так как ссылка одна и та же.
Для глубокого копирования нужно клонировать и вложенные объекты:
public Person deepClone() {
Person cloned = this.clone();
cloned.address = this.address.clone(); // предполагается, что Address тоже реализует clone
return cloned;
}