Java中的對象復制可以分為深復制和淺復制兩種方式。深復制指的是將對象的所有屬性都復制一份新的,而不是只是復制引用。而淺復制則是只復制引用。
深復制在Java中可以通過實現Cloneable接口并重寫Object類中的clone()方法來實現。clone()方法默認是淺復制,所以需要在重寫方法中逐一將所有屬性進行復制。以下是一個示例:
public class Person implements Cloneable { private String name; private int age; private Address address; // 實現深復制 public Object clone() throws CloneNotSupportedException { Person p = (Person) super.clone(); p.address = (Address) this.address.clone(); return p; } // getters and setters... } public class Address implements Cloneable { private String city; private String street; // 實現深復制 public Object clone() throws CloneNotSupportedException { return super.clone(); } // getters and setters... }
這里,Person類中的address屬性是另一個對象,所以需要在clone()方法中遞歸進行深復制。而Address類中并沒有其他屬性,因此可以直接返回super.clone()。
相比之下,淺復制要簡單得多。只需要實現Cloneable接口并重寫clone()方法,然后在其中調用super.clone()即可。以下是一個示例:
public class Person implements Cloneable { private String name; private int age; private Address address; // 實現淺復制 public Object clone() throws CloneNotSupportedException { return super.clone(); } // getters and setters... } public class Address implements Cloneable { private String city; private String street; // 實現淺復制 public Object clone() throws CloneNotSupportedException { return super.clone(); } // getters and setters... }
需要注意的是,如果對象中的屬性也是引用類型,那么淺復制只會復制引用,而不會復制對象本身。因此在使用淺復制時需要特別小心。