区别
浅复制
被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制
被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。
定义如下一个类:
class Test {
public int i;
public StringBuffer s;
}
如图所示,给出了对这个类的对象进行复制时,浅复制与深复制的区别。
使用
下面是一段深复制的代码,当我们在使用时,检查类中是否含有引用类型成员变量,如果没有则直接返回super.clone()即可;若有确保类中包含的所有非基本类型的成员变量都实现了深复制。
import java.util.Date;
public class DeepCopy implements Cloneable{
private Date birth = new Date();
public void setBirth(Date birth) {
this.birth = birth;
}
public Date getBirth() {
return birth;
}
public void changeDate(){
this.birth.setMonth(4);
}
public Object clone(){
DeepCopy o =null;
try{
o = (DeepCopy)super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
//实现深复制,成员变量如果是引用类型依然是使用clone方法
o.birth = (Date)this.getBirth().clone();
return o;
}
}