java 深拷贝浅拷贝代码实现
时间: 2024-09-12 21:01:31 浏览: 35
在Java中,浅拷贝(Shallow Copy)指的是对对象的复制仅完成了第一层对象的复制,即只复制了对象中的字段,如果字段中还包含有其他对象的引用,这些对象的引用不会被复制,仍然是共享同一个对象。而深拷贝(Deep Copy)则是指对对象以及对象中引用的其他对象进行完全的复制,即复制的对象与其引用的其他对象互不影响。
以下是浅拷贝和深拷贝的代码实现示例:
1. 浅拷贝示例:
```java
class Person implements Cloneable {
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;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Person original = new Person("Alice", 25);
Person shallowCopy = (Person) original.clone();
System.out.println("Original: " + original.getName() + ", age: " + original.getAge());
System.out.println("Shallow Copy: " + shallowCopy.getName() + ", age: " + shallowCopy.getAge());
// 修改原始对象的引用字段
original.setName("Bob");
// 浅拷贝和原始对象共享引用字段,所以共享对象的修改会反映在两个对象上
System.out.println("After changing original name:");
System.out.println("Original: " + original.getName() + ", age: " + original.getAge());
System.out.println("Shallow Copy: " + shallowCopy.getName() + ", age: " + shallowCopy.getAge());
}
}
```
2. 深拷贝示例:
```java
class Person implements Cloneable {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// ... getters and setters ...
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
// 深拷贝需要对引用类型的字段进行单独复制
cloned.address = (Address) this.address.clone();
return cloned;
}
}
class Address implements Cloneable {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// ... getters and setters ...
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Main St", "Anytown");
Person original = new Person("Alice", 25, address);
Person deepCopy = (Person) original.clone();
System.out.println("Original: " + original.getName() + ", " + original.getAddress().getStreet());
System.out.println("Deep Copy: " + deepCopy.getName() + ", " + deepCopy.getAddress().getStreet());
// 修改原始对象的引用字段
original.getAddress().setStreet("Highway");
// 深拷贝和原始对象不共享引用字段,所以修改不会反映在深拷贝对象上
System.out.println("After changing original address:");
System.out.println("Original: " + original.getName() + ", " + original.getAddress().getStreet());
System.out.println("Deep Copy: " + deepCopy.getName() + ", " + deepCopy.getAddress().getStreet());
}
}
```