Clone 方法的使用(深度克隆)

如下的程序,我们克隆羊圈,每个羊圈里有一只羊
<wbr></wbr>

package test.lang;

public class Sheep implements Cloneable {
<wbr> private String name;</wbr>

<wbr> public String getName() {<br><wbr><wbr><wbr> return name;<br><wbr> }</wbr></wbr></wbr></wbr></wbr>

<wbr> public void setName(String name) {<br><wbr><wbr><wbr> this.name = name;<br><wbr> }</wbr></wbr></wbr></wbr></wbr>

<wbr> @Override<br><wbr> public Sheep clone() throws CloneNotSupportedExcepti<wbr>on {<br><wbr><wbr><wbr> return (Sheep) super.clone();<br><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr> public static void main(String[] args) throws CloneNotSupportedExcepti<wbr>on {<br><wbr><wbr><wbr> Sheepfold sheepfold1 = new Sheepfold();<br><wbr><wbr><wbr> sheepfold1.setName("第一个羊圈");<br><wbr><wbr><wbr> Sheep sheep1 = new Sheep();<br><wbr><wbr><wbr> sheep1.setName("第一只羊");<br><wbr><wbr><wbr> sheepfold1.setSheep(sheep1);<br><wbr><wbr><wbr> Sheepfold sheepfold2 = sheepfold1.clone();<br><wbr><wbr><wbr> sheepfold2.setName("第一个羊圈的克隆");<br><wbr><wbr><wbr> System.out.println("sheepfold1.name=" + sheepfold1.getName() + ",sheep.name=" + sheepfold1.getSheep().getName());<br><wbr><wbr><wbr> System.out.println("sheepfold2.name=" + sheepfold2.getName() + ",sheep.name=" + sheepfold2.getSheep().getName());<br><wbr><wbr><wbr> System.out.println("sheepfold1.sheep==sheepfold1.sheep?" + (sheepfold1.getSheep() == sheepfold2.getSheep()));<br><wbr> }<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

class Sheepfold implements Cloneable {
<wbr> private String name;</wbr>

<wbr> private Sheep sheep;</wbr>

<wbr> @Override<br><wbr> public Sheepfold clone() throws CloneNotSupportedExcepti<wbr>on {<br><wbr><wbr><wbr> Sheepfold o = (Sheepfold) super.clone();</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> return o;<br><wbr> }</wbr></wbr></wbr></wbr>

<wbr> public String getName() {<br><wbr><wbr><wbr> return name;<br><wbr> }</wbr></wbr></wbr></wbr></wbr>

<wbr> public void setName(String name) {<br><wbr><wbr><wbr> this.name = name;<br><wbr> }</wbr></wbr></wbr></wbr></wbr>

<wbr> public Sheep getSheep() {<br><wbr><wbr><wbr> return sheep;<br><wbr> }</wbr></wbr></wbr></wbr></wbr>

<wbr> public void setSheep(Sheep sheep) {<br><wbr><wbr><wbr> this.sheep = sheep;<br><wbr> }<br> }</wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

运行结果如下:

sheepfold1.name=第一个羊圈,sheep.name=第一只羊
sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊
sheepfold1.sheep==sheepfold1.sheep?true

<wbr></wbr>

克隆的羊圈,里面的羊还是第一个羊圈的羊,他们完全相同.并没有被克隆过来,这就是浅层克隆,我们调整代码,实现深层克隆

<wbr> @Override<br><wbr> public Sheepfold clone() throws CloneNotSupportedExcepti<wbr>on {<br><wbr><wbr><wbr> Sheepfold o = (Sheepfold) super.clone();<br><wbr><wbr><wbr> o.sheep = this.sheep.clone();<br><wbr><wbr><wbr> return o;<br><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

运行结果

sheepfold1.name=第一个羊圈,sheep.name=第一只羊
sheepfold2.name=第一个羊圈的克隆,sheep.name=第一只羊
sheepfold1.sheep==sheepfold1.sheep?false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值