在Java中,深拷貝和淺拷貝是兩種不同的對象復制方式。
-
淺拷貝:創建一個新對象,然后將原對象的非靜態字段復制到新對象中。如果字段是值類型的,那么對該字段執行逐位復制。如果字段是引用類型的,則復制引用但不復制引用的對象。因此,原始對象及其副本引用同一個對象。
-
深拷貝:創建一個新對象,并將原對象的非靜態字段復制到新對象中。如果字段是值類型的,那么對該字段執行逐位復制。如果字段是引用類型的,則遞歸地復制引用的對象,直到遇到值類型為止。因此,原始對象及其副本引用不同的對象。
以下是一個簡單的Java代碼示例,展示了淺拷貝和深拷貝的區別:
class Person implements Cloneable {String name;int age;Address address;public Person(String name, int age, Address address) {this.name = name;this.age = age;this.address = address;}// 淺拷貝public Object clone() throws CloneNotSupportedException {return super.clone();}// 深拷貝public Person deepClone() {return new Person(new String(this.name), this.age, new Address(this.address.city, this.address.street));}
}class Address {String city;String street;public Address(String city, String street) {this.city = city;this.street = street;}
}public class Main {public static void main(String[] args) throws CloneNotSupportedException {Address address = new Address("北京", "朝陽路");Person person1 = new Person("張三", 30, address);Person person2 = (Person) person1.clone(); // 淺拷貝Person person3 = person1.deepClone(); // 深拷貝System.out.println("person1: " + person1.address.city + ", " + person1.address.street);System.out.println("person2: " + person2.address.city + ", " + person2.address.street);System.out.println("person3: " + person3.address.city + ", " + person3.address.street);person1.address.city = "上海";System.out.println("修改person1的地址后:");System.out.println("person1: " + person1.address.city + ", " + person1.address.street);System.out.println("person2: " + person2.address.city + ", " + person2.address.street);System.out.println("person3: " + person3.address.city + ", " + person3.address.street);}
}
輸出結果:
person1: 北京, 朝陽路
person2: 北京, 朝陽路
person3: 北京, 朝陽路
修改person1的地址后:
person1: 上海, 朝陽路
person2: 上海, 朝陽路
person3: 北京, 朝陽路
從輸出結果可以看出,淺拷貝時,person1和person2引用的是同一個Address對象,而深拷貝時,person1和person3引用的是兩個不同的Address對象。