这篇文章我们来介绍什么是拷贝,并且实现浅拷贝到深拷贝。
目录
一、浅拷贝
1.1 clone 方法
1.2 实现浅拷贝:
1.2.1 重写 clone方法
1.2.2 实现接口 Cloneable
1.2.3 调用克隆方法
1.2.4 原理图:
1.3 浅拷贝的不足
1.3.1 增加引用类型
1.3.2 再次克隆
1.3.3 浅拷贝的不足原理图:
二、深拷贝
2.1 实现深拷贝
一、浅拷贝
浅拷贝是指创建一个新的对象,当被拷贝的引用中 含有引用类型参数时,改变该参数,两个引用的值都会改变。
1.1 clone 方法
我们在Object类中见到了有clone方法
clone 方法是Object类中的一个方法,用于创建并返回当前对象的一个副本。副本是一个全新的对象,但是它包含了原始对象所有的字段和值。
1.2 实现浅拷贝:
1.2.1 重写 clone方法
我们先看看 Object 类中 clone 的源码
仿照源码,我们来重写clone方法
1.2.2 实现接口 Cloneable
我们看看这个接口的源码,我们发现这个接口是空的
我们叫这种接口为空接口,也叫标记接口,这里这个接口表明当前类可以被克隆
1.2.3 调用克隆方法
1.2.4 原理图:
1.3 浅拷贝的不足
我们上面介绍浅拷贝时说了,它的缺点,在被克隆的引用中有引用类型时,改变引用类型,两个引用的值都会改变,我们来看看是不是
1.3.1 增加引用类型
1.3.2 再次克隆
并且改变其中一个money的值看看
结果和我们预想的一致,Money对象没有被克隆。
1.3.3 浅拷贝的不足原理图:
二、深拷贝
2.1 实现深拷贝
为了避免浅拷贝的缺点,我们进行深拷贝,去优化clone方法
1.先把引用类型的类改成克隆的形式,并且重写clone方法
2.优化clone方法,首先调用父类的clone()方法来克隆Person对象,然后将Person对象中的Money对象也克隆一份,并将其赋给克隆后的Person对象的m变量。然后返回这个克隆后的Person对象
这样就完成了深拷贝