Java当中的深拷贝和浅拷贝
发布人:shili8
发布时间:2025-02-12 09:03
阅读次数:0
**浅拷贝和深拷贝**
在 Java 中,对象的复制可以分为浅拷贝和深拷贝两种。理解这两个概念对于编写高质量的 Java代码至关重要。
### 浅拷贝浅拷贝是指创建一个新对象,并将原对象中的所有成员变量(包括基本类型和引用类型)复制到新对象中。但是,这个过程并不对被引用的对象进行复制。也就是说,如果原对象中包含了其他对象的引用,那么浅拷贝后的新对象仍然指向同一个被引用的对象。
**示例代码**
javapublic class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Main { public static void main(String[] args) { Person person1 = new Person("John",30); Person person2 = (Person) person1.clone(); // 浅拷贝 System.out.println(person1.getName()); // John System.out.println(person1.getAge()); //30 System.out.println(person2.getName()); // John System.out.println(person2.getAge()); //30 person1.setAge(31); System.out.println(person1.getAge()); //31 System.out.println(person2.getAge()); //31 } }
在这个例子中,`person1` 和 `person2` 是两个浅拷贝后的对象,它们都指向同一个 `Person` 对象。因此,当我们修改 `person1` 的年龄时,`person2` 的年龄也会被改变。
### 深拷贝深拷贝是指创建一个新对象,并对原对象中的所有成员变量(包括基本类型和引用类型)进行复制。这意味着如果原对象中包含了其他对象的引用,那么深拷贝后的新对象将拥有自己的副本,而不是指向同一个被引用的对象。
**示例代码**
javapublic class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class Address { private String street; private String city; public Address(String street, String city) { this.street = street; this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } public class Main { public static void main(String[] args) { Person person1 = new Person("John",30); Address address1 = new Address("123 Main St", "Anytown"); person1.setAddress(address1); Person person2 = (Person) person1.clone(); // 深拷贝 Address address2 = (Address) address1.clone(); // 深拷贝 System.out.println(person1.getName()); // John System.out.println(person1.getAge()); //30 System.out.println(person1.getAddress().getStreet()); //123 Main St System.out.println(person1.getAddress().getCity()); // Anytown person2.setAddress(new Address("456 Elm St", "Othertown")); System.out.println(person1.getAddress().getStreet()); //123 Main St System.out.println(person1.getAddress().getCity()); // Anytown } }
在这个例子中,`person1` 和 `person2` 是两个深拷贝后的对象,它们都拥有自己的副本。因此,当我们修改 `person2` 的地址时,`person1` 的地址不会被改变。
**总结**
浅拷贝和深拷贝是 Java 中对象复制的两种方式。浅拷贝只对基本类型进行复制,而深拷贝则对所有成员变量(包括基本类型和引用类型)进行复制。如果原对象中包含了其他对象的引用,那么浅拷贝后的新对象仍然指向同一个被引用的对象,而深拷贝后的新对象将拥有自己的副本。