Sobes.tech
Junior
165

Yuzaki nusxa olish haqida nima bilasiz?

AIdan javob

sobes.tech AI

Yuzaki nusxa (shallow copy) ob'ektning yangi nusxasini yaratadi, ammo asl ob'ektning maydonlari tomonidan murojaat qilinadigan ob'ektlarni nusxalamaydi. Buning o'rniga, faqat murojaatlar nusxalanadi.

Xususiyatlar:

  • Nusxa olingan, o'zgartiriladigan ob'ektlarga bo'ladigan o'zgarishlar asl ob'ektda va aksincha ko'rinadi.
  • Ko'p murojaatga ega ob'ektlar uchun chuqur nusxadan tezroq.

Misol uchun, clone() metodi (agar ob'ekt Cloneable ni amalga oshirgan bo'lsa) yoki qo'lda amalga oshiriladi.

clone() misoli:

// O'zgartiriladigan maydon bilan sinf yaratamiz
class Address {
    String city;

    public Address(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
               "city='" + city + '\'' +
               '}';
    }
}

// Addressga murojaat qiladigan va `Cloneable` ni amalga oshiradigan sinf yaratamiz
class Person implements Cloneable {
    String name;
    Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    // Object.clone() yordamida yuzaki nusxa
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
               "name='" + name + '\'' +
               ", address=" + address +
               '}';
    }
}

// Foydalanish misoli
public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address originalAddress = new Address("New York");
        Person originalPerson = new Person("Alice", originalAddress);

        // Yuzaki nusxa
        Person copiedPerson = (Person) originalPerson.clone();

        System.out.println("Asl shaxs: " + originalPerson);
        System.out.println("Nusxa olingan shaxs: " + copiedPerson);

        // Asl ob'ektning ichki maydonini o'zgartiramiz...
        originalAddress.city = "Los Angeles";

        // ...o'zgartirishlar nusxada ham ko'rinadi, chunki ikkisi ham bir xil Address ob'ektiga murojaat qiladi
        System.out.println("\nAsl manzilni o'zgartirgandan keyin:");
        System.out.println("Asl shaxs: " + originalPerson);
        System.out.println("Nusxa olingan shaxs: " + copiedPerson);
    }
}

Qo'llaniladi, chunki ob'ektlar hierarxiyasining to'liq nusxalanishi shart emas yoki ichki ob'ektlar o'zgarmas bo'lsa.