Rumah >Java >javaTutorial >Bagaimanakah pengklonan objek dilaksanakan di Jawa?

Bagaimanakah pengklonan objek dilaksanakan di Jawa?

WBOY
WBOYasal
2024-04-11 21:18:01459semak imbas

Klon objek dalam Java dilaksanakan melalui antara muka Boleh Diklon Anda mesti mengatasi kaedah klon() dan membuang CloneNotSupportedException secara eksplisit. Pengklonan boleh dibahagikan kepada salinan dalam dan salinan cetek: 1. Salinan dalam mencipta salinan lengkap objek, termasuk medan berubah-ubah 2. Salinan cetek hanya menyalin rujukan, dan objek asal dan salinan berkongsi data yang sama.

Bagaimanakah pengklonan objek dilaksanakan di Jawa?

Bagaimanakah pengklonan objek dilaksanakan di Jawa?

Pengenalan

Dalam pengaturcaraan Java, pengklonan digunakan untuk mencipta salinan objek tanpa mengubah suai objek asal. Pengklonan objek boleh digunakan dalam pelbagai senario, seperti mencipta berbilang contoh objek, menghantar salinan objek untuk mengelakkan pengubahsuaian objek asal, dan melaksanakan salinan dalam dan cetek.

Melaksanakan pengklonan

Klon dalam Java dilaksanakan oleh antara muka Boleh Diklon. Mana-mana kelas yang ingin melaksanakan pengklonan mesti melaksanakan antara muka ini dan mengatasi kaedah clone(). Kaedah clone() mengembalikan klon objek dan mesti membuang CloneNotSupportedException secara eksplisit jika kelas tidak menyokong pengklonan. Cloneable 接口实现的。任何希望实现克隆的类都必须实现此接口并覆盖clone() 方法。clone() 方法返回对象的克隆,并且必须显式抛出 CloneNotSupportedException,如果该类不支持克隆。

深层拷贝和浅层拷贝

当克隆对象时,可以进行两种类型的拷贝:深层拷贝和浅层拷贝。

  • 深层拷贝: 创建对象副本的完全新副本,包括其所有字段。即使是可变字段也会被复制,因此对副本的任何更改都不会影响原始对象。
  • 浅层拷贝: 仅复制对象及其可变字段的引用,原始对象和副本指向相同的底层数据。因此,对副本的任何更改也会影响原始对象。

实战案例

考虑以下 Student 类,它具有三个字段:姓名、年龄和地址:

public class Student implements Cloneable {
  private String name;
  private int age;
  private Address address;

  @Override
  public Object clone() throws CloneNotSupportedException {
    return super.clone();
  }

  // 省略getter 和 setter 方法
}

Address 类也是可克隆的:

public class Address implements Cloneable {
  private String street;
  private String city;
  private String state;

  @Override
  public Object clone() throws CloneNotSupportedException {
    return super.clone();
  }

  // 省略getter 和 setter 方法
}

现在,考虑以下代码:

// 创建原始 Student 对象
Student originalStudent = new Student();
originalStudent.setName("John Doe");
originalStudent.setAge(21);
Address originalAddress = new Address();
originalAddress.setStreet("123 Main Street");
originalStudent.setAddress(originalAddress);

// 克隆原始Student对象
Student clonedStudent = (Student) originalStudent.clone();

// 修改克隆对象的字段
clonedStudent.setName("Jane Doe");
clonedStudent.setAge(22);
Address clonedAddress = clonedStudent.getAddress();
clonedAddress.setStreet("456 Elm Street");

// 输出原始和克隆对象
System.out.println("Original Student:" + originalStudent);
System.out.println("Cloned Student:" + clonedStudent);

输出将显示:

Original Student:Student{name='John Doe', age=21, address=Address{street='123 Main Street', city=null, state=null}}
Cloned Student:Student{name='Jane Doe', age=22, address=Address{street='456 Elm Street', city=null, state=null}}

在这种情况下,由于 Address

🎜Deep Copy dan Shallow Copy🎜🎜🎜Apabila mengklon objek, dua jenis salinan boleh dibuat: salinan dalam dan salinan cetek. 🎜
  • 🎜Salinan dalam: 🎜 Buat salinan objek yang baharu sepenuhnya, termasuk semua medannya. Malah medan boleh ubah disalin, jadi sebarang perubahan pada salinan tidak akan menjejaskan objek asal.
  • 🎜Salinan cetek: 🎜 Hanya rujukan kepada objek dan medan boleh ubahnya disalin Objek asal dan salin menghala ke data asas yang sama. Oleh itu, sebarang perubahan pada salinan juga mempengaruhi objek asal.
🎜🎜Kes praktikal🎜🎜🎜Pertimbangkan kelas Pelajar berikut, yang mempunyai tiga medan: nama, umur dan alamat: 🎜rrreee🎜Alamat Kelas juga boleh diklon: 🎜rrreee🎜 Sekarang, pertimbangkan kod berikut: 🎜rrreee🎜Output akan menunjukkan: 🎜rrreee🎜Dalam kes ini, memandangkan kelas Alamat boleh diklon, ini adalah salinan Deep . Apabila anda mengubah suai medan alamat objek klon, ia tidak menjejaskan medan alamat objek asal. 🎜

Atas ialah kandungan terperinci Bagaimanakah pengklonan objek dilaksanakan 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