当需要一个与之前对象相同的对象时,应当实现该类的Cloneable接口,一般来说clone方法的实现如下:
protected Chicken clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Chicken cloneChicken = null;
try {
cloneChicken = (Chicken) super.clone();
} catch (CloneNotSupportedException e) {
// TODO: handle exception
e.printStackTrace();
}
return cloneChicken;
}
这样,在克隆对象进行修改时不会对母对象造成影响。
而赋值运算会使得两个对象在内存中指向同一片区域,导致修改克隆对象的同时也会对母对象进行同样的修改。
// 使用clone方法
Chicken chicken2 = new Chicken("mom");
Chicken cloneChicken = null;
try {
cloneChicken = chicken2.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.gc();
}
cloneChicken.changeName("dad");
System.out.println(cloneChicken.getName() + "," + chicken2.getName());
cloneChicken = chicken2;
cloneChicken.changeName("dad");
System.out.println(cloneChicken.getName() + "," + chicken2.getName());
上述结果输出为
mom,dad
dad,dad