浅拷贝
定义:
创建一个新对象,这个新对象有着原始对象所包含的属性值的一份拷贝。如果属性值是基本数据类型,那么在新对象和原始对象之间会创建一个真正的副本。如果属性值是引用数据类型,那么在新对象和原始对象之间会创建一个指向同一个对象的引用
修改了内部对象,原始对象的内容也跟着改变
——浅拷贝
如何实现拷贝
进行拷贝需要调用Object类中的clone()方法
在调用的时候我们有一些注意事项
当我们去直接调用clone()方法时,会报错
我们需要在Student类中实现Cloneable接口
并重写Object类中的clone
方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
返回值时Object类型
需要强转
成子类类型
还会报错
还需要再main方法中和clone方法的提供的方法保持一致
即函数后面加上throws CloneNotSupportedException
表示这是支持克隆的
这就实现了拷贝
验证浅拷贝
我们在创建一个Number类(属性值是引用类型)
public class Number {
public double num=9.9;
public Number() {
}
public Number(double num) {
this.num = num;
}
}
再已经创建好的Student类中添加number属性
public class Student implements Cloneable{
private String name;
private int age;
Number number=new Number();
//省略了构造方法和空参构造
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
打印不同对象修改前的num和修改后的num
System.out.println("修改前stu:"+stu.number.num);
System.out.println("修改前stu2:"+stu2.number.num);
stu2.number.num=9.99;
System.out.println("修改后stu:"+stu.number.num);
System.out.println("修改后stu2:"+stu2.number.num);
内存图
由于只拷贝了Student类中的name和age属性,没有拷贝num
深拷贝
定义:
创建一个新对象,并递归地复制原始对象中包含的所有属性值。在这种情况下,如果属性值是引用数据类型,那么在新对象和原始对象之间会创建一个真正的副本
修改了内部对象,原始对象保持不变
——深拷贝
也就是把num克隆一份
实现
在Number类中实现Cloneable并重写clone方法
public class Number implements Cloneable {
public double num=9.9;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
在Student类中调用Number中的clone方法
注意:
this是调用者的地址
protected Object clone() throws CloneNotSupportedException {
Student tmp =(Student)super.clone();
tmp.number=(Number)this.number.clone();
return tmp;
}
打印结果
内存图
总结
了解了深拷贝和浅拷贝的区别,并学会用内存图分析代码
❤️❤️❤️❤️