为何重写clone,浅拷贝与深拷贝?

2021-05-15

本文记录实体重写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包下的样例