• Cloneable接口与浅克隆,深克隆


    文章目录

    浅克隆,深克隆又称为浅拷贝、深拷贝。

    浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
    深拷贝:对基本数据类型进行值传递,对引用数据类型创建一个新的对象,并复制其内容,此为深拷贝
    在这里插入图片描述
    由图可以看出,浅拷贝是有风险的浅拷贝时,对于引用数据类型的数据,拷贝对象的此属性也指向了原对象的引用地址,说明拷贝对象没有新建此引用对象,而是直接将原对象的引用对象地址给了拷贝对象,这样带来的问题是,两个对象对此属性的操作,会相互影响

    例如: 浅拷贝

    public class Thing implements Cloneable{
         //定义一个私有变量
         private ArrayList<String> arrayList = new ArrayList<String>();
         @Override
         public Thing clone(){
                 Thing thing=null;
                 try {
                        thing = (Thing)super.clone();
                 } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                 }
                 return thing;
         }
         //设置HashMap的值
         public void setValue(String value){
                 this.arrayList.add(value);
         }
         //取得arrayList的值
         public ArrayList<String> getValue(){
                 return this.arrayList;
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在Thing类中增加一个私有变量arrayLis,类型为ArrayList,然后通过setValue和getValue分别进行设置和取值,我们来看场景类是如何拷贝的,如代码所示。

    浅拷贝测试

    public class Client {
         public static void main(String[] args) {
                 //产生一个对象
                 Thing thing = new Thing();
                 //设置一个值
                 thing.setValue("张三");
                 //拷贝一个对象
                 Thing cloneThing = thing.clone();
                 cloneThing.setValue("李四");
                 System.out.println(thing.getValue());
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    猜想一下运行结果应该是什么?是仅一个“张三”吗?运行结果如下所示:

    [张三,李四]

    怎么会有李四呢?是因为Java做了一个偷懒的拷贝动作,Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。

    深克隆可以使用工具类:https://blog.csdn.net/qq_40419080/article/details/120952834

  • 相关阅读:
    MySQL知识点归纳总结(一)
    SMART S7-200PLC串行自由口通讯(耐压测试仪)
    C++ 多态和虚函数详解
    C++笔记:类和对象(一)->封装
    TCP和UDP的区别
    Oracle之RMAN联机和脱机备份(二)
    Nacos全面知识 ----微服务 SpringCloud
    Android 通用首页代码示例
    分布式消息队列RocketMQ详细下载安装教程
    BGE M3-Embedding 模型介绍
  • 原文地址:https://blog.csdn.net/qq_40419080/article/details/127960081