informasi kontak saya
Surat[email protected]
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 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 denganCloneable
Antarmuka dan penulisan ulangclone()
Metode untuk menerapkan penyalinan dangkal.Object
di 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.jikaOriginal
Objek disalin secara dangkal, lalunums
dan pada objek aslinyanums
akan menunjuk ke objek array yang sama.
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,nums
Array juga disalin, sehingga objek asli dan salinannya tidak dibagikannums
Himpunan.
Memilih untuk menggunakan salinan dalam atau salinan dangkal bergantung pada skenario dan persyaratan aplikasi tertentu.
Apa kelas dalam anonim di Jawa? Apa skenario penerapannya?