浅拷贝:
public class PrototypeClass implements Cloneable { private List<String> params = new ArrayList<String>(); @Override protected PrototypeClass clone() { PrototypeClass prototypeClass = null; try { prototypeClass = (PrototypeClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return prototypeClass; } public void setValue(String param) { this.params.add(param); } public List getValue(){ return this.params; } }
测试一下:
public class PrototypeClassTest { @Test public void test(){ PrototypeClass prototypeClass = new PrototypeClass(); prototypeClass.setValue("12"); PrototypeClass clone = prototypeClass.clone(); clone.setValue("13"); System.out.println(prototypeClass.getValue()); } }
运行一下你会发现结果并不是你想象的["12"],而是["12","13"],这种情况是因为Java做了一个偷懒的拷贝动作,object对象提供的clone()方法只是拷贝了对象,其对象内部的数组、引用对象(String是一个特殊的引用对象,它是没有clone方法的,是能够被拷贝的,)都不会被拷贝,还是指向原生对象的内部元素地址,这种拷贝叫做浅拷贝。
深拷贝:
public class PrototypeClass implements Cloneable { private ArrayList<String> params = new ArrayList<String>(); @Override protected PrototypeClass clone() { PrototypeClass prototypeClass = null; try { prototypeClass = (PrototypeClass) super.clone(); this.params = (ArrayList<String>) params.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return prototypeClass; } public void setValue(String param) { this.params.add(param); } public List getValue(){ return this.params; } }
只需要将类中的成员变量单独拷贝,这样便是深拷贝。