H5W3
当前位置:H5W3 > java > 正文

【Java】【Java基础】深浅拷贝

【Java基础】深浅拷贝

远方发布于 2 月 4 日

什么是浅拷贝和深拷贝

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

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

【Java】【Java基础】深浅拷贝
【Java】【Java基础】深浅拷贝

Object的clone()方法

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

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

1、浅拷贝

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

2、深拷贝

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

3、String类型的特殊性

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

java
阅读 8发布于 2 月 4 日
本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
avatar

远方

专注

1 声望
0 粉丝

0 条评论
得票时间

avatar

远方

专注

1 声望
0 粉丝

宣传栏

什么是浅拷贝和深拷贝

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

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

【Java】【Java基础】深浅拷贝
【Java】【Java基础】深浅拷贝

Object的clone()方法

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

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

1、浅拷贝

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

2、深拷贝

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

3、String类型的特殊性

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

本文地址:H5W3 » 【Java】【Java基础】深浅拷贝

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址