Berbagi teknologi

Tolong jelaskan perbedaan antara salinan dalam dan salinan dangkal di Java. Apa kelas dalam anonim di Jawa? Apa skenario penerapannya?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Tolong jelaskan perbedaan antara salinan dalam dan salinan dangkal di Java.

Di Java, Deep Copy dan Shallow Copy adalah dua cara menyalin objek. Perilaku keduanya saat menyalin objek pada dasarnya berbeda.

Salinan dangkal

Salinan dangkal mengacu pada pembuatan objek baru dan kemudian menyalin bidang non-statis dari objek saat ini ke objek baru. Jika bidang tersebut adalah tipe nilai, maka bidang tersebut disalin sedikit demi sedikit; referensi disalin tetapi tidak Objek yang direferensikan tidak disalin. Oleh karena itu, benda asli dan salinannya merujuk pada benda yang sama.

Di Jawa, hal ini dapat dicapai denganCloneableAntarmuka dan penulisan ulangclone()Metode untuk menerapkan penyalinan dangkal.Objectdi kelasclone()Metode ini dapat menghasilkan penyalinan yang dangkal.

class Original implements Cloneable {
private int[] nums;
public Original() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

Dalam contoh ini,nums adalah tipe referensi.jikaOriginalObjek disalin secara dangkal, lalunumsdan pada objek aslinyanumsakan menunjuk ke objek array yang sama.

Salinan Dalam

Salinan dalam tidak hanya menyalin objek itu sendiri, tetapi juga secara rekursif menyalin semua variabel anggota tipe referensi yang terdapat dalam objek, yang berarti bahwa salinan dan objek asli tidak akan berbagi variabel anggota tipe referensi apa pun. Memodifikasi variabel anggota suatu objek tidak akan mempengaruhi objek lainnya.

Di Java, penerapan salinan dalam sering kali memerlukan penulisan kode secara manual untuk memastikan bahwa semua variabel anggota tipe referensi disalin dengan benar.

class DeepCopied implements Cloneable {
private int[] nums;
public DeepCopied() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
@Override
public Object clone() throws CloneNotSupportedException {
DeepCopied copied = (DeepCopied) super.clone();
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝
return copied;
}
}

Dalam contoh ini,numsArray juga disalin, sehingga objek asli dan salinannya tidak dibagikannumsHimpunan.

Meringkaskan

  • Salinan dangkalObjek itu sendiri dan bidang non-statisnya disalin, tetapi objek yang direferensikan tidak disalin.
  • salinan yang dalamTidak hanya objek itu sendiri dan bidang non-statisnya yang disalin, tetapi semua variabel anggota tipe referensi juga disalin secara rekursif.

Memilih untuk menggunakan salinan dalam atau salinan dangkal bergantung pada skenario dan persyaratan aplikasi tertentu.


Apa kelas dalam anonim di Jawa? Apa skenario penerapannya?