2019-07-30 深拷贝和浅拷贝

一、浅拷贝

数据类型如果是基本类型,会按照值传递,进行赋值操作,将属性值复制一份给新的对象;

如果是引用类型的数据变量,将内存的引用地址复制一份给新的变量,实际上是两个对象的成员变量都指向一个实例;

这种情况下对一个成员变量的修改会影响到另一个成员变量。

二、深拷贝

不止要复制对象的 所有基本属性和成员对象的值,还要为所有对象申请内存空间,并且复制每个引用类型的成员变量,换而言之就是对整个对象图进行拷贝。

浅拷贝与深拷贝的区别

浅拷贝只是复制并传递地址引用,让多个对象指向相同的地址;而深拷贝直接连地址空间都全部复制过来。


深拷贝原理图


浅拷贝原理图

示例程序的运行结果:


程序段1

该段程序的运行结果为p1、p2的名字互不相同,而年龄相同,这是因为p1将引用指向了新的一个字符串,没有在原来的基础上做修改

只是将原来指向摇头耶稣的指针修改为了指向“小傻瓜”的指针,因此p2的值不受影响;然而int类型是基本类型,需要值传递,所以修改年龄为99会导致统一修改的结果。

三、浅拷贝的两种实现方法

通过拷贝构造方法实现浅拷贝

通过重写clone()方法进行浅拷贝(如图所示)


四、深拷贝的两种实现方法

通过clone方法实现

通过序列化实现

你可能感兴趣的:(2019-07-30 深拷贝和浅拷贝)