Java 中物件的克隆透過 Cloneable 介面實現,必須覆寫 clone() 方法並明確拋出 CloneNotSupportedException。複製可以分為深層拷貝和淺層拷貝:1. 深層拷貝建立物件的完整副本,包括可變欄位;2. 淺層拷貝僅複製引用,原始物件和副本共享相同的資料。
Java 中物件的複製是如何實現的?
簡介
在 Java 程式設計中,複製用於建立物件的副本,而無需修改原始物件。物件的複製可以用於各種場景,例如建立物件的多個實例、傳遞物件的副本以避免修改原始對象,以及實現深層拷貝和淺層拷貝。
實作複製
Java 中的複製是由 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
類別是可複製的,因此這是一個深層拷貝。當修改複製物件的位址欄位時,它不會影響原始物件的位址欄位。
以上是Java中物件的克隆是如何實現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!