java对象浅克隆和深克隆

2022-12-20 0 477

在该文javacodelet的形式一类codelet的形式是:采用Object的clone方式codelet。彼时也明确提出,布季夫有浅布季夫和深布季夫,那时他们就聊呵呵第一类的浅布季夫(浅复本)和深布季夫(深复本)。

第一类的浅布季夫

他们先给单元试验,再给基本概念,这种易于认知。单元试验如下表所示:

java对象浅克隆和深克隆浅布季夫试验类
java对象浅克隆和深克隆浅布季夫试验类
java对象浅克隆和深克隆浅布季夫试验运转类

运转结论如下表所示:

java对象浅克隆和深克隆浅布季夫试验运转结论

上面的类结构比较简单,且图中重点部分都用红线标注了,这里就不多说了。他们这里再强调下clone方式的采用:

1,需要实现Cloneable接口,如果不实现会抛出运转时异常,参见:java的异常体系

2,重写Object的clone方式

从运转结论看,他们能看出:1)Monkey类源第一类monkey和布季夫第一类monkeyShallowCopy虽然内容一致都是name=球球,但两个第一类的地址不一致。2)Dog类源第一类和布季夫第一类不但内容一样,地址也一样。他们之间的内存关系图如下表所示:

java对象浅克隆和深克隆浅布季夫第一类内存示意图

他们这里给第一类的浅布季夫一个定义:java的浅复本就是对基本类型进行值传递,对应用类型进行引用传递。

他们可以想想浅布季夫有什么副作用。以上面的例子为例,如果他们不清楚浅布季夫的原理,他们很有可能在monkeyShallowCopy中对dog的名字进行更改,这时候源第一类monkey中的dog名字也会被修改,从而引发问题,如果出现这种问题,非常难排查。

第一类的深布季夫

他们要解决浅布季夫的引用传递问你题其实很简单,既然Monkey类重写了Object类的clone方式,他们让Dog类也重写Object的clone方式。试验程序如下表所示:

java对象浅克隆和深克隆深布季夫试验程序
java对象浅克隆和深克隆深布季夫试验程序
java对象浅克隆和深克隆深布季夫试验程序

深度布季夫试验程序运行结论:

java对象浅克隆和深克隆深布季夫试验运转结论

从结论他们能看出dog第一类也进行了一次复本,使得monkey和monkeyShallowCopy两个第一类引用的dog第一类不再一样。他们之间的内存关系如下表所示:

java对象浅克隆和深克隆深布季夫后第一类内存示意图

除了采用clone方式,还有一类形式能实现深布季夫,那就是序列化和反序列化。有兴趣的朋友可以自行进行尝试。

我是myydream,写作配图不易,加个关注,他们一起进行技术探秘。

往期该文:

jvm虚拟机如何创建java第一类

一个java第一类占用多少内存

java第一类头里都有什么

关注我,一起进行技术探秘

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务