今天开发中遇到一个问题:
需要将一个对象进行clone,对他的副本的属性进行修改,供一个特定的对象使用,完成某个需求。
平时对java的clone看的不是很多,相当然的使用了Object的clone()方法:
SomObject obj = new SonObject();
SomObject objClone =obj.clone();
结果发现更新obj的某个成员变量的时候(ArrayList),objClone中的成员变量也相应的发生变化!但是obj.hashCode() 却不等于objClone.hashCode(),说明他们并没有指向同一个对象!看到这个结果一下子蒙了,这是为什么呢??
仔细想了一下,恍然大悟:java中的clone是浅拷贝,只是拷贝对象本身,以及基本数据类型,对于对象的非基本数据类型变量,比如ArrayList等,并不进行拷贝!
---------
需要将一个对象进行clone,对他的副本的属性进行修改,供一个特定的对象使用,完成某个需求。
平时对java的clone看的不是很多,相当然的使用了Object的clone()方法:
SomObject obj = new SonObject();
SomObject objClone =obj.clone();
结果发现更新obj的某个成员变量的时候(ArrayList),objClone中的成员变量也相应的发生变化!但是obj.hashCode() 却不等于objClone.hashCode(),说明他们并没有指向同一个对象!看到这个结果一下子蒙了,这是为什么呢??
仔细想了一下,恍然大悟:java中的clone是浅拷贝,只是拷贝对象本身,以及基本数据类型,对于对象的非基本数据类型变量,比如ArrayList等,并不进行拷贝!
---------
java 代码
public class SomObject implements Cloneable{
private List wifeList;
private int count;
....
public Object clone(){
try{
return super.clone();
}catch(....){
....
}
return null;
}
}
SomObject obj = new SomObject();
obj.setCount(1);
obj.setWifeList(new ArrayList("Beautifule"));
SomObjec cloneObj = (SomObject)obj.clone();
obj.setCount(2);
obj.setWifeList(new ArrayList("Tender"));
System.out.println(obj.getCount());//结果 2
System.out.println(obj.getWifeList().get(0));//Tender
System.out.println(cloneObj.getCount());//结果 1
System.out.println(cloneObj.getWifeList().get(0));//Tender
本文探讨了Java中实现对象克隆时遇到的问题,通过具体案例分析了浅拷贝的特性,即只复制对象本身及基本数据类型,而引用类型如ArrayList则共享同一实例。

被折叠的 条评论
为什么被折叠?



