想要了解浅拷贝和深拷贝之前,要了解的是值传递和引用传递。
值传递:传递的是变量的值,对该值进行修改不会影响原来变量的值
引用传递:传递的是变量的在堆中的引用,修改其值,会影响实际变量
这里只是简单的介绍,想要详细了解的话,建议查看其他博客
知道了值传递和引用传递就可以来了解浅拷贝和深拷贝了
浅拷贝:基本类型拷贝的是值,引用类型拷贝的是引用
深拷贝:基本类型拷贝的是值,引用类型拷贝的也是值
用具体的例子来展示浅拷贝和深拷贝,重写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();
}
}
测试类
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);
}
}
当我们用的是浅拷贝时,查看代码的运行结果
可以看到修改boy1时,boy中的值也被改变了
再来使用深拷贝,查看代码的运行结果
可以看到修改boy1的值不会对boy产生影响