Junior
161
¿Qué sabes sobre la copia superficial?
Respuesta de la IA
sobes.tech AI
Поверхностное копирование (shallow copy) создает новую копию объекта, но не копирует объекты, на которые ссылаются поля исходного объекта. Скорее, копируются сами ссылки.
Особенности:
- Изменения в мутабельных объектах, на которые ссылаются копии, будут видны в исходном объекте и наоборот.
- Быстрее, чем глубокое копирование для объектов со множеством ссылок.
Реализуется, например, методом clone() (если объект реализует Cloneable) или вручную.
Пример clone():
// Создаем класс с мутабельным полем
class Address {
String city;
public Address(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
// Создаем класс с ссылкой на Address, реализуем Cloneable
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Реализуем поверхностное копирование через Object.clone()
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", address=" + address +
'}';
}
}
// Пример использования
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address originalAddress = new Address("New York");
Person originalPerson = new Person("Alice", originalAddress);
// Поверхностное копирование
Person copiedPerson = (Person) originalPerson.clone();
System.out.println("Original Person: " + originalPerson);
System.out.println("Copied Person: " + copiedPerson);
// Изменяем мутабельное поле во вложенном объекте исходного...
originalAddress.city = "Los Angeles";
// ...изменения видны и в копии, так как ссылаются на один и тот же объект Address
System.out.println("\nAfter modifying original address:");
System.out.println("Original Person: " + originalPerson);
System.out.println("Copied Person: " + copiedPerson);
}
}
Применяется, когда нет необходимости в полном дублировании всей иерархии объектов, или когда вложенные объекты являются иммутабельными.