小工具知识网

当前位置: 首页 > 行业知识 > 浅拷贝和深拷贝

行业知识

浅拷贝和深拷贝

2026-10-27 09:49:17 来源:互联网转载

文章目录

  • 浅拷贝
    • 如何实现拷贝
      • 在调用的时候我们有一些注意事项
      • 验证浅拷贝
      • 内存图
      • 深拷贝
        • 实现
        • 内存图
        • 总结

          浅拷贝

          定义:

          创建一个新对象,这个新对象有着原始对象所包含的属性值的一份拷贝。如果属性值是基本数据类型,那么在新对象和原始对象之间会创建一个真正的副本。如果属性值是引用数据类型,那么在新对象和原始对象之间会创建一个指向同一个对象的引用

          修改了内部对象,原始对象的内容也跟着改变——浅拷贝

          如何实现拷贝

          进行拷贝需要调用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;    }

          打印结果

          内存图

          总结

          了解了深拷贝和浅拷贝的区别,并学会用内存图分析代码

          ❤️❤️❤️❤️

上一篇:Win10录屏功能全解析,轻松上手录屏技巧!

下一篇:开国际服务器怎么开启?