Rumah >Java >javaTutorial >Apakah perbezaan antara salinan cetek dan salinan dalam di Jawa?

Apakah perbezaan antara salinan cetek dan salinan dalam di Jawa?

PHPz
PHPzasal
2024-04-11 12:33:011278semak imbas

Perbezaan antara salinan cetek dan salinan dalam: Salinan cetek: Cipta objek yang merujuk data yang sama dan menukar salinan juga akan menjejaskan objek asal. Salinan dalam: Buat objek yang mengandungi salinan data objek asal Menukar salinan tidak akan menjejaskan objek asal.

Apakah perbezaan antara salinan cetek dan salinan dalam di Jawa?

Shallow Copy dan Deep Copy dalam Java

Pengenalan

Di Jawa, memahami konsep salinan cetek dan salinan dalam adalah penting untuk operasi objek. Tutorial ini memperincikan perbezaan antara keduanya dan menggambarkannya dengan contoh kod.

Salinan cetek

  • Mencipta objek baharu yang merujuk data asas yang sama bagi objek asal.
  • Sebarang perubahan pada salinan cetek juga akan ditunjukkan pada objek asal dan begitu juga sebaliknya.
  • Ikut prinsip "rujukan yang sama".

Contoh Kod:

class Person {
    private String name;
    private Address address;
}

public class ShallowCopyDemo {

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("John Doe");
        Address addr = new Address();
        addr.setStreet("123 Main St.");
        p1.setAddress(addr);

        // Shallow copy
        Person p2 = p1;

        // 更改 p2 的地址
        p2.getAddress().setStreet("456 Elm St.");

        // p1 的地址也发生了变化
        System.out.println(p1.getAddress().getStreet()); // 输出:456 Elm St.
    }
}

Dalam contoh ini, p2 ialah salinan cetek p1 dan ia merujuk objek Alamat yang sama . Oleh itu, perubahan pada alamat p2 juga akan mempengaruhi p1. p2p1 的浅拷贝,它们引用相同的 Address 对象。因此,对 p2 的地址进行更改也会影响 p1

深拷贝

  • 创建一个新对象,该对象拥有原始对象底层数据的独立副本。
  • 更改深拷贝不会影响原始对象,反之亦然。
  • 遵循“内容相同”原则。

代码示例:

使用 clone() 方法或第三方库(如 Apache Commons Lang)来实现深拷贝。

使用 clone() 方法:

class Person implements Cloneable {
    private String name;
    private Address address;

    @Override
    public Person clone() {
        try {
            // 使用 super.clone() 创建新对象
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

public class DeepCopyDemo {

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("John Doe");
        Address addr = new Address();
        addr.setStreet("123 Main St.");
        p1.setAddress(addr);

        // Deep copy
        Person p2 = p1.clone();

        // 更改 p2 的地址
        p2.getAddress().setStreet("456 Elm St.");

        // p1 的地址保持不变
        System.out.println(p1.getAddress().getStreet()); // 输出:123 Main St.
    }
}

在此示例中,clone() 方法为 p1 创建了一个深拷贝。更改 p2 的地址不会影响 p1,因为它们引用不同的 Address

Salinan dalam

    Mencipta objek baharu yang memegang salinan bebas data asas objek asal.
  • Menukar salinan dalam tidak akan menjejaskan objek asal dan begitu juga sebaliknya.
  • Ikut prinsip "
  • kandungan yang sama".

Contoh kod:

🎜🎜Gunakan kaedah clone() atau pustaka pihak ketiga (seperti Apache Commons Lang) untuk melaksanakan salinan dalam. 🎜🎜🎜Menggunakan kaedah klon(): 🎜🎜rrreee🎜Dalam contoh ini, kaedah clone() mencipta salinan mendalam p1. Menukar alamat p2 tidak akan menjejaskan p1 kerana ia merujuk kepada objek Alamat yang berbeza. 🎜🎜🎜Bila menggunakan salinan dalam atau salinan cetek? 🎜🎜🎜🎜🎜Salinan cetek: 🎜Salinan cetek boleh dilakukan apabila tiada kesan sampingan untuk mengubah suai salinan objek. 🎜🎜🎜Salinan Dalam: 🎜Salinan dalam diperlukan apabila mengubah suai salinan objek yang mungkin menjejaskan objek asal. 🎜🎜🎜Sebagai contoh, sentiasa gunakan salinan dalam apabila menyimpan objek atau menghantarnya kepada kod yang tidak dipercayai. 🎜

Atas ialah kandungan terperinci Apakah perbezaan antara salinan cetek dan salinan dalam di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn