Sobes.tech
Junior
89
questionbank

Что ты знаешь о поверхностном копировании?

Ответ от нейросети

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

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