Sobes.tech
Junior
167

Какво знаеш за повърхностното копиране?

Отговор от AI

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("Оригинален човек: " + originalPerson);
        System.out.println("Копиран човек: " + copiedPerson);

        // Модифицираме променяемото поле в вложения обект на оригинала...
        originalAddress.city = "Los Angeles";

        // ...промените са видими и в копието, тъй като и двете сочат към един и същи Address обект
        System.out.println("\nСлед промяна на оригиналния адрес:");
        System.out.println("Оригинален човек: " + originalPerson);
        System.out.println("Копиран човек: " + copiedPerson);
    }
}

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