【Java】【Java基础】深浅拷贝
【Java基础】深浅拷贝
远方发布于 2 月 4 日
什么是浅拷贝和深拷贝
1、深浅拷贝是针对引用类型的数据来讲的,基本数据类型没有深浅拷贝的概念,基本类型的数据都是值传递
2、从开发实际出发,可以比较直接的理解为:在对一个实例对象进行拷贝动作后,
DEEP: 如果实例对象的全部值都拷贝到了新的对象中,即新对象的值全部是新开辟内存空间存储的,则理解为深拷贝SHALLOW: 如果没能将实例对象的全部值都拷贝到新的对象中,则是浅拷贝
Object的clone()方法
Object的clone()方法本身比较好理解,它限制所有调用clone()方法的对象,都必须实现 Cloneable
接口,否者将抛出 CloneNotSupportedException
这个异常。而 Cloneable 接口其实什么方法都没有,可以简单的理解只是一个标记,告诉开发者可以对这个对象进行拷贝。
在Java中,无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。比如以下深浅拷贝的示例。
1、浅拷贝
分析:只有基本类型(int)和String类型的数据拷贝到了新对象,引用类型的值未拷贝到新对象,只拷贝了对象的引用。拷贝过程如图
延用Object的clone()方法,未进行方法体重写
2、深拷贝
分析:在以上浅拷贝的基础上我们重写Object的clone()方法体,达到对引用对象值的拷贝。如图
其实这里比较容易理解,在SrcObj的clone()方法中是new出来的ChildObj对象,自然绕开了只拷贝引用的问题。
3、String类型的特殊性
String的特殊性在于,它虽然是引用类型,但他指向的值为常量,克隆出来的对象改变的值,实际上是改变了克隆出来对象String类型成员的指向,不会影响被克隆对象的值及其指向。String类型的变量clone后的,表现好象也实现了深度clone,但其实只是一个假象。
阅读 8发布于 2 月 4 日
本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
远方
专注
1 声望
0 粉丝
远方
专注
1 声望
0 粉丝
宣传栏
目录
什么是浅拷贝和深拷贝
1、深浅拷贝是针对引用类型的数据来讲的,基本数据类型没有深浅拷贝的概念,基本类型的数据都是值传递
2、从开发实际出发,可以比较直接的理解为:在对一个实例对象进行拷贝动作后,
DEEP: 如果实例对象的全部值都拷贝到了新的对象中,即新对象的值全部是新开辟内存空间存储的,则理解为深拷贝SHALLOW: 如果没能将实例对象的全部值都拷贝到新的对象中,则是浅拷贝
Object的clone()方法
Object的clone()方法本身比较好理解,它限制所有调用clone()方法的对象,都必须实现 Cloneable
接口,否者将抛出 CloneNotSupportedException
这个异常。而 Cloneable 接口其实什么方法都没有,可以简单的理解只是一个标记,告诉开发者可以对这个对象进行拷贝。
在Java中,无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。比如以下深浅拷贝的示例。
1、浅拷贝
分析:只有基本类型(int)和String类型的数据拷贝到了新对象,引用类型的值未拷贝到新对象,只拷贝了对象的引用。拷贝过程如图
延用Object的clone()方法,未进行方法体重写
2、深拷贝
分析:在以上浅拷贝的基础上我们重写Object的clone()方法体,达到对引用对象值的拷贝。如图
其实这里比较容易理解,在SrcObj的clone()方法中是new出来的ChildObj对象,自然绕开了只拷贝引用的问题。
3、String类型的特殊性
String的特殊性在于,它虽然是引用类型,但他指向的值为常量,克隆出来的对象改变的值,实际上是改变了克隆出来对象String类型成员的指向,不会影响被克隆对象的值及其指向。String类型的变量clone后的,表现好象也实现了深度clone,但其实只是一个假象。
以上是 【Java】【Java基础】深浅拷贝 的全部内容, 来源链接: utcz.com/a/113169.html
得票时间