【Java基础】深浅拷贝

什么是浅拷贝和深拷贝

1、深浅拷贝是针对引用类型的数据来讲的,基本数据类型没有深浅拷贝的概念,基本类型的数据都是值传递
2、从开发实际出发,可以比较直接的理解为:在对一个实例对象进行拷贝动作后,

DEEP: 如果实例对象的全部值都拷贝到了新的对象中,即新对象的值全部是新开辟内存空间存储的,则理解为深拷贝
SHALLOW: 如果没能将实例对象的全部值都拷贝到新的对象中,则是浅拷贝

【Java基础】深浅拷贝_第1张图片
【Java基础】深浅拷贝_第2张图片

Object的clone()方法

Object的clone()方法本身比较好理解,它限制所有调用clone()方法的对象,都必须实现 Cloneable 接口,否者将抛出 CloneNotSupportedException 这个异常。而 Cloneable 接口其实什么方法都没有,可以简单的理解只是一个标记,告诉开发者可以对这个对象进行拷贝。
【Java基础】深浅拷贝_第3张图片

在Java中,无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。比如以下深浅拷贝的示例。

1、浅拷贝

分析:只有基本类型(int)和String类型的数据拷贝到了新对象,引用类型的值未拷贝到新对象,只拷贝了对象的引用。拷贝过程如图
【Java基础】深浅拷贝_第4张图片
延用Object的clone()方法,未进行方法体重写
image.png

2、深拷贝

分析:在以上浅拷贝的基础上我们重写Object的clone()方法体,达到对引用对象值的拷贝。如图
【Java基础】深浅拷贝_第5张图片
其实这里比较容易理解,在SrcObj的clone()方法中是new出来的ChildObj对象,自然绕开了只拷贝引用的问题。

3、String类型的特殊性

String的特殊性在于,它虽然是引用类型,但他指向的值为常量,克隆出来的对象改变的值,实际上是改变了克隆出来对象String类型成员的指向,不会影响被克隆对象的值及其指向。String类型的变量clone后的,表现好象也实现了深度clone,但其实只是一个假象。

你可能感兴趣的:(java)