今天编写一个用到Cloneable接口的程序时才注意到原来clone()方法提供的是浅层拷贝,而不是我先前认为的深层拷贝。
class A implements Cloneable{
int a=1;
ArrayList b=new ArrayList();
public A getClone(){
return (A) this.clone();
}
}
对于这样的一个类,如果调用它的getClone()方法进行复制的话,成员变量a会被复制,但是成员变量b不会像预想的那样会复制一个
ArrayList(),复制的对象与原先的对象中的b都会指向相同的一个ArrayList()。因此如果需要做深层拷贝需要添加额外的代码。
class A implements Cloneable{
int a=1;
ArrayList b=new ArrayList();
public A getClone(){
A temp=(A) this.clone();
temp.b=new ArrayList();
for(int i=0;i<b.size();i++){
temp.b.add(b.get(i));
}
return temp;
}
}
原始对象中的字符串和数组不受到克隆对象设置值的影响(会创建一个独立的),而类对象变量则会受到了克隆对象的影响。如list、map........ ;static修饰的也将是以引用的形式克隆
http://hi.baidu.com/lzqxiaoqiang09/blog/item/61ebce62b3fde36d0d33faaf.html
本文探讨了Java中Cloneable接口实现的浅拷贝原理,并通过实例代码展示了如何实现深拷贝。针对集合类型的成员变量,浅拷贝只会复制引用而非实际内容,这可能导致意外的副作用。为解决这一问题,文章提供了实现深拷贝的具体方法。
1207

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



