浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。即:浅拷贝只拷贝引用,深拷贝拷贝引用和对象。
浅拷贝引发的内存泄漏
由于浅拷贝只拷贝指针导致两个指针指向同一块地址,会导致释放内存时这块内存被释放两次,会导致内存泄漏。
浅拷贝的实现:
// 测试代码
Person p1 = new Person(23, "root");
Person p2 = p1.clone();
深拷贝的实现:
// 测试类
public class Person implements Cloneable {
...
public Person clone() throws CloneNotSupportedException {
Person cloned = (Person)super.clone();
cloned.name = (String)name.clone();
return cloned;
}
}
如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个被引用的对象必须也要实现Cloneable接口并且实现clone方法。