clone的深拷贝与浅拷贝

想要了解浅拷贝和深拷贝之前,要了解的是值传递和引用传递。
值传递:传递的是变量的值,对该值进行修改不会影响原来变量的值
引用传递:传递的是变量的在堆中的引用,修改其值,会影响实际变量
这里只是简单的介绍,想要详细了解的话,建议查看其他博客
知道了值传递和引用传递就可以来了解浅拷贝和深拷贝了
浅拷贝:基本类型拷贝的是值,引用类型拷贝的是引用
深拷贝:基本类型拷贝的是值,引用类型拷贝的也是值
用具体的例子来展示浅拷贝和深拷贝,重写clone方法需要实现Cloneable标识接口,标识该类是可以拷贝的,不然拷贝时会报错
首先申明两个类
Boy类

package clone; public class Boy implements Cloneable { private Girl girl; private String name; private int age; @Override public String toString() { return "Boy [girl=" + girl + ", name=" + name + ", age=" + age + "]"; } public Boy() { super(); // TODO 自动生成的构造函数存根 } public Boy(Girl girl, String name, int age) { super(); this.girl = girl; this.name = name; this.age = age; } public Girl getGirl() { return girl; } public void setGirl(Girl girl) { this.girl = girl; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override protected Object clone() throws CloneNotSupportedException { // TODO 自动生成的方法存根 Boy clone = (Boy) super.clone(); //浅拷贝时去除,下面这句话 clone.girl = (Girl) girl.clone(); return clone; }}

Girl类
package clone; public class Girl implements Cloneable { private String name; private int age; public Girl(String name, int age) { super(); this.name = name; this.age = age; } public Girl() { super(); // TODO 自动生成的构造函数存根 } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Girl [name=" + name + ", age=" + age + "]"; } @Override protected Object clone() throws CloneNotSupportedException { // TODO 自动生成的方法存根 return super.clone(); } }

【clone的深拷贝与浅拷贝】测试类
package clone; public class CloneTest { public static void main(String[] args) throws CloneNotSupportedException {Girl girl = new Girl("Helen", 32); Boy boy = new Boy(girl, "Mike", 33); Boy boy1 = (Boy) boy.clone(); boy1.getGirl().setName("Smith"); System.out.println(boy); System.out.println(boy1); }}

当我们用的是浅拷贝时,查看代码的运行结果
clone的深拷贝与浅拷贝
文章图片

可以看到修改boy1时,boy中的值也被改变了
再来使用深拷贝,查看代码的运行结果
clone的深拷贝与浅拷贝
文章图片

可以看到修改boy1的值不会对boy产生影响

    推荐阅读