在该文javacodelet的形式一类codelet的形式是:采用Object的clone方式codelet。彼时也明确提出,布季夫有浅布季夫和深布季夫,那时他们就聊呵呵第一类的浅布季夫(浅复本)和深布季夫(深复本)。
第一类的浅布季夫
他们先给单元试验,再给基本概念,这种易于认知。单元试验如下表所示:



运转结论如下表所示:

上面的类结构比较简单,且图中重点部分都用红线标注了,这里就不多说了。他们这里再强调下clone方式的采用:
1,需要实现Cloneable接口,如果不实现会抛出运转时异常,参见:java的异常体系
2,重写Object的clone方式
从运转结论看,他们能看出:1)Monkey类源第一类monkey和布季夫第一类monkeyShallowCopy虽然内容一致都是name=球球,但两个第一类的地址不一致。2)Dog类源第一类和布季夫第一类不但内容一样,地址也一样。他们之间的内存关系图如下表所示:

他们这里给第一类的浅布季夫一个定义:java的浅复本就是对基本类型进行值传递,对应用类型进行引用传递。
他们可以想想浅布季夫有什么副作用。以上面的例子为例,如果他们不清楚浅布季夫的原理,他们很有可能在monkeyShallowCopy中对dog的名字进行更改,这时候源第一类monkey中的dog名字也会被修改,从而引发问题,如果出现这种问题,非常难排查。
第一类的深布季夫
他们要解决浅布季夫的引用传递问你题其实很简单,既然Monkey类重写了Object类的clone方式,他们让Dog类也重写Object的clone方式。试验程序如下表所示:



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

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

除了采用clone方式,还有一类形式能实现深布季夫,那就是序列化和反序列化。有兴趣的朋友可以自行进行尝试。
我是myydream,写作配图不易,加个关注,他们一起进行技术探秘。
往期该文:
jvm虚拟机如何创建java第一类
一个java第一类占用多少内存
java第一类头里都有什么
关注我,一起进行技术探秘