1. Konsep salinan dangkal dan salinan dalam
⑴ Salinan Haling (Kloning Dangkal)
Semua variabel objek yang disalin berisi nilai yang sama dengan objek asli, sedangkan semua referensi ke objek lain masih menunjuk ke objek asli. Dengan kata lain, menyalin dangkal secara sederhana menyalin objek yang dipertimbangkan, bukan objek yang dirujuknya.
⑵ Salinan dalam (kloning dalam)
Semua variabel objek yang disalin berisi nilai yang sama dengan objek asli, kecuali variabel -variabel yang merujuk ke objek lain. Variabel -variabel yang merujuk ke objek lain akan menunjuk ke objek baru yang disalin, alih -alih objek yang direferensikan asli. Dengan kata lain, salinan dalam menyalin semua objek yang dirujuk oleh objek yang akan disalin.
2. Metode Java's Clone ()
⑴ Metode klon menyalin salinan objek dan mengembalikannya ke penelepon. Secara umum, metode clone () memuaskan:
① Untuk objek apa pun x, ada x.clone ()! = X // Objek yang dikloning bukan objek yang sama dengan objek asli ② untuk objek x apa pun, ada x.clone (). GetClass () = = x .
⑵ Clone of Objects in Java
① Untuk mendapatkan salinan objek, kita dapat menggunakan metode klon () dari kelas objek.
② Timpa metode klon () dari kelas dasar di kelas yang diturunkan dan menyatakannya sebagai publik.
③ Dalam metode klon () dari kelas turunan, hubungi super.clone ().
④ Menerapkan antarmuka yang dapat dikloning di kelas turunan.
Silakan lihat kode berikut:
Siswa Public mengimplementasikan {string name; Siswa) super.clone (); // clone () di objek mengenali objek mana yang ingin Anda salin. } Catch (ClonenotsupportedException e) {System.out.println (e.tostring ()); S2 = (Siswa) S1.Clone (); System.out.println ("name ="+s1.name+","+"usia ="+s1.age); +s2.age); menjelaskan:
①Mengapa kita harus memanggil super.clone () saat menimpa metode klon objek () di kelas turunan? Pada waktu lari, klon () di objek mengenali objek mana yang ingin Anda salin, kemudian mengalokasikan ruang untuk objek ini, dan menyalin objek, menyalin konten objek asli satu per satu ke dalam ruang penyimpanan objek baru.
② Metode klon () yang diwarisi dari kelas java.lang.Object adalah salinan dangkal. Kode berikut dapat membuktikannya.
Kelas Profesor {String Name; usia int; Siswa (String Name, Int Age, Profesor P) {this.name = name; .clone (); ) {Profesor P = Profesor Baru ("Wangwu", 50); "; s2.p.age = 30; System.out.println (" name = "+s1.p.name+", "+" usia = "+s1.p.age); System.out.println (" Nama = "+s2.p.name+", "+" usia = "+s2.p.age); // Hasil output dari profesor siswa 1 dan 2 menjadi lisi, dan usia 30 tahun. }} Jadi bagaimana kita harus menerapkan kloning mendalam, yaitu, profesor yang memodifikasi S2 tidak akan mempengaruhi profesor siapa S1? Kode ditingkatkan sebagai berikut.
Perbaikan untuk membuat profesor siswa tidak berubah (klon dalam)
Kelas Profesor yang dapat dikloning {String Name; clone (); usia, profesor p) {this.name = name; } Catch (ClonenotsupportedException E) {System.out.println (E.ToString ()); ] ARGS) {Profesor P = Profesor Baru ("Wangwu", 50); "Lisi"; System.out.println ("name ="+s1.p.name+","+"usia ="+s1.p.age); "+" usia = "+s2.p.age);}} 3. Gunakan serialisasi untuk melakukan salinan yang dalam (terutama untuk menghindari penulisan ulang metode klon () dari salinan dalam objek yang lebih kompleks, dan juga dapat menerapkan transmisi kontinu breakpoint dan fungsi lainnya)
Proses penulisan objek ke dalam aliran adalah proses serialisasi, tetapi sangat jelas disebut proses "beku" atau "memetik" di lingkaran programmer Java; proses.
Harus ditunjukkan bahwa apa yang ditulis dalam aliran adalah salinan objek, dan objek asli masih ada di JVM, jadi apa yang "acar ke dalam acar" hanyalah salinan objek, dan acar java masih bisa Jadilah segar.
Menyalin secara mendalam suatu objek dalam bahasa Java sering dapat membuat objek mengimplementasikan antarmuka serial terlebih dahulu, dan kemudian menulis objek (sebenarnya hanya salinan objek) ke dalam aliran (acar ke dalam acar), dan kemudian membacanya dari aliran (masukkan acar kembali) dapat merekonstruksi objek.
Berikut ini adalah kode sumber salinan dalam.
Objek Publik DeepClone () {// Tuliskan objek ke dalam stream BytearRayoutoutStream Bo = new ByteArrayOutputStream (); Bo.TobyTeArray ()); Premis melakukan ini adalah bahwa objek dan semua objek yang direferensikan dalam objek dapat di -serial. . di luar. Kode contoh di atas ditingkatkan sebagai berikut.
Guru Kelas Serializable {String Name; Usia; Public Void Student (nama string, usia, Teacher T) {this.name = name; Pergi ke stream bytearrayoutoutstream bo = bytearrayoutputstream baru (); ObjectInputStream (BI); 18); name = "+s1.t.name+", "+" usia = "+s1.t.age);}}