Cara Melaksanakan Salinan Cetek dan Salin Dalam di Jawa



Artikel ini akan memberi anda pengetahuan terperinci dan komprehensif mengenai Salinan Cetek dan Salinan Dalam di Jawa dengan Contoh.

Pengklonan adalah proses membuat replika atau salinan objek, kaedah klon Java.lang.Object digunakan untuk membuat salinan atau replika objek. objek java yang melaksanakan Cloneable interface layak menggunakan kaedah klon. Dalam artikel ini, kita akan membincangkan Salinan Cetek dan Salinan Dalam dalam urutan berikut:

Membuat Salinan Objek Java

Kita boleh membuat replika atau salinan objek java dengan





apakah kelas tanpa nama di java

1. Membuat salinan objek di lokasi memori yang berbeza. Ini dipanggil salinan dalam.

2. Membuat rujukan baru yang menunjukkan lokasi memori yang sama. Ini juga dipanggil salinan Cetek.



Salinan Cetek

Pelaksanaan default metode klon membuat salinan dangkal dari objek sumber, itu bermaksud contoh baru dari jenis Objek dibuat, ia menyalin semua bidang ke instance baru dan mengembalikan objek baru dari jenis 'Objek'. Objek ini secara eksplisit perlu dicetak dalam jenis objek objek sumber.

Objek ini akan mempunyai salinan tepat dari semua bidang objek sumber termasuk jenis primitif dan rujukan objek. Sekiranya objek sumber mengandungi rujukan ke objek lain di lapangan, maka dalam contoh baru hanya akan merujuk kepada objek tersebut, salinan objek tersebut tidak akan dibuat. Ini bermaksud jika kita membuat perubahan dalam salinan cetek maka perubahan akan tercermin dalam objek sumber. Kedua-dua keadaan tidak bebas.

Kaedah klon dalam kelas Objek dilindungi secara semula jadi, jadi tidak semua kelas dapat menggunakan kaedah klon (). Anda perlu melaksanakan antara muka Cloneable dan mengganti kaedah klon. Sekiranya antara muka Cloneable tidak dilaksanakan maka anda akan mendapat CloneNotSupportedException.super.clone () akan mengembalikan salinan cetek seperti yang dilaksanakan dalam kelas Objek.



Kod untuk Salinan Cetek

pakej com.test class Department {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} kelas Pekerja melaksanakan Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Versi lalai kaedah clone (). Ia menghasilkan salinan objek yang cetek. Clone Objek yang dilindungi () melemparkan CloneNotSupportedException {return super.clone ()}} kelas awam ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Pekerja emp1 = Pekerja baru (111, 'John', dept1) Pekerja emp2 = null cuba {// Membuat klon emp1 dan menetapkannya ke emp2 emp2 = (Pekerja) emp1.clone ()} menangkap (CloneNotSupportedException e) {e. printStackTrace ()} // Mencetak sebutan 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Mengubah sebutan 'emp2' emp2.dept.designation = 'Director' // Perubahan ini akan dicerminkan dalam System.out.println (emp1.dept.designation) System.out.println yang asal Pekerja // Output: Director}}

Pengeluaran:

Output-Shallow-Copy

tali boleh berubah atau tidak berubah dalam java

Dalam contoh di atas, kita mempunyai emp1 kelas Karyawan yang mempunyai tiga pemboleh ubah kelas id (int), nama (String) dan jabatan (Department).

Kami sekarang mengklon emp1 ke emp2 untuk membuat salinan cetek, setelah itu kami mengubah sebutan menggunakan objek emp2 dan mengesahkan bahawa perubahan yang sama juga tercermin dalam emp1.


Salinan Dalam

Salinan mendalam objek akan memiliki salinan yang tepat dari semua bidang objek sumber seperti salinan cetek, tetapi tidak seperti salinan cetek jika objek sumber mempunyai rujukan untuk objek sebagai bidang, maka replika objek dibuat dengan memanggil klon kaedah. Ini bermaksud bahawa kedua-dua objek sumber dan tujuan saling bergantung antara satu sama lain. Sebarang perubahan yang dibuat pada objek yang diklon tidak akan mempengaruhi objek sumber.

Kod untuk Salinan Dalam

pakej com.test class Department melaksanakan Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versi lalai klon () kaedah. objek dilindungi klon () melemparkan kelas CloneNotSupportedException {return super.clone ()}} Pekerja mengimplementasikan Cloneable {int id Nama tali Jabatan jabatan awam Kakitangan (int id, Nama rentetan, jabatan Jabatan) {this.id = id this.name = name this.dept = dept} // Overriding clone () kaedah untuk membuat salinan mendalam objek. dilindungi klon Objek () melemparkan CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} kelas awam DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Membuat klon emp1 dan menetapkannya ke emp2 emp2 = (Pekerja) emp1.clone ()} tangkapan (CloneNotSupportedException e) {e.printStackTrace ()} // Mencetak sebutan 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Mengubah sebutan 'emp2' emp2.dept.designation = 'Director' // Perubahan ini akan dicerminkan dalam Sistem pekerja 'emp1' asli.out.println (emp1.dept.designation) // Output: AVP}}

Pengeluaran:

Dalam contoh salinan Deep di atas, tidak seperti salinan cetek, kedua-dua objek sumber dan tujuan saling bergantung antara satu sama lain. Sebarang perubahan yang dibuat dalam emp2 tidak akan memberi kesan kepada emp1.

Perbezaan Antara Salinan Cetek dan Salinan Dalam

Salinan Cetek Salinan Dalam
Objek klon dan objek sumber tidak terpisah sepenuhnyaObjek klon dan objek sumber benar-benar bebas antara satu sama lain.
Perubahan yang dibuat dalam contoh kloning akan mempengaruhi pemboleh ubah rujukan objek sumberPerubahan yang dibuat dalam contoh kloning tidak akan mempengaruhi pemboleh ubah rujukan objek sumber.
Versi lalai klon adalah salinan cetekUntuk membuat salinan mendalam, kita perlu mengatasi kaedah klon kelas Objek.
Salinan cetek lebih disukai jika pemboleh ubah kelas objek hanya jenis primitif sebagai bidangSalinan mendalam lebih disukai jika pemboleh ubah kelas objek mempunyai rujukan ke objek lain sebagai medan.
Ia agak pantasIa agak perlahan.

Dengan ini, kita sampai pada akhir artikel Salinan Cetek dan Salinan Dalam. Saya harap anda dapat memahami pelbagai perbezaan antara keduanya.

pentadbir yang diperakui cloudera untuk apache hadoop

Lihat oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kursus latihan dan pensijilan Java J2EE dan SOA Edureka dirancang untuk pelajar dan profesional yang ingin menjadi Pembangun Java.

Ada soalan untuk kami? Sila sebutkan di bahagian komen di blog 'Salinan Dangkal dan Salin Dalam' ini dan kami akan menghubungi anda secepat mungkin.