Java深拷贝与浅拷贝
浅拷贝(Shallow Copy):
浅拷贝是对对象的引用进行复制,新旧对象还是会引用同一个对象。当这个被引用的对象发生改变时,新旧对象的状态也会发生改变。
深拷贝(Deep Copy):
深拷贝是对对象的所有层次的复制,包括对象内部的所有引用。新的对象与原对象不会共享任何引用。
Java中实现深拷贝的方法之一是通过实现Cloneable
接口并覆盖clone()
方法。
以下是一个简单的例子,演示如何实现深拷贝:
public class Person implements Cloneable {
private String name;
private Address address;
// 构造方法、getter和setter省略
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = (Address) this.address.clone(); // 深拷贝内部的Address对象
return cloned;
}
}
public class Address implements Cloneable {
private String street;
private String city;
// 构造方法、getter和setter省略
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
try {
Person originalPerson = new Person("John", new Address("123 Main St", "Anytown"));
Person clonedPerson = (Person) originalPerson.clone();
// 修改原始对象的内部状态,不会影响克隆后的对象
originalPerson.getAddress().setStreet("456 Elm St");
// 输出结果证明深拷贝成功
System.out.println(clonedPerson.getAddress().getStreet()); // 输出 "123 Main St"
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
在这个例子中,Person
类实现了Cloneable
接口并覆盖了clone()
方法,确保了Person
对象的深拷贝。同时,Address
类也实现了Cloneable
接口并覆盖了clone()
方法,确保了Address
对象的浅拷贝。在Person
的clone()
方法中,对内部的Address
对象进行了深拷贝。这样,当原始Person
对象的状态发生改变时,克隆后的Person
对象就不会受到影响。
评论已关闭