今天开发中遇到一个问题:
需要将一个对象进行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());
System.out.println(obj.getWifeList().get(
0));
System.out.println(cloneObj.getCount());
System.out.println(cloneObj.getWifeList().get(
0));