本文记录实体重写clone方法学习
- 重写clone方法的作用
- 浅拷贝与深拷贝
什么是浅拷贝与深拷贝
浅拷贝是指直接调用clone()方法进行对象拷贝的操作,如下:
EntityCloneStudy s1 = new EntityCloneStudy(101, "WangQiang");
// s2 克隆 s1
EntityCloneStudy s2 = (EntityCloneStudy) s1.clone();
浅拷贝对于基础数据类型没有影响,但是对于引用类型存在影响;对于引用类型,浅拷贝只是赋值,对象s1、s2的引用均指向相同的对象(相同地址),会造成对象修改时互相影响。
因此,对于包含引用类型的实体,我们为了避免这个问题,需要重写clone方法,对于引用类型进行深clone。
如何深克隆
- 我们需要在引用类型的类里先重写clone方法
- 然后在有该引用类型的实体里重写clone方法
示例:
有实体如下,因为存在引用类型Address,因此我们要先重写Address
的clone方法,再重写EntityCloneStudy
的clone方法
public class EntityCloneStudy implements Cloneable {
private int id;
private String name;
private Address address;
}
1、重写Address
的clone的方法如下,首先需要先 implements Cloneable,然后重写clone方法
/**
* 重写clone方法
*/
@Override
public Object clone() throws CloneNotSupportedException {
Address address = (Address)super.clone();
return address;
}
2、重写EntityCloneStudy
的clone方法如下
// 重写clone方法实现深克隆
@Override
public Object clone() throws CloneNotSupportedException {
EntityCloneStudy entityCloneStudy = (EntityCloneStudy) super.clone();
entityCloneStudy.address = (Address) address.clone();
return entityCloneStudy;
}
3、完成后,使用 clone方法clone EntityCloneStudy
就可以实现深克隆。
参考:java- test项目-clone包下的样例