• java.lang.Object 之 clone() 深拷贝,浅拷贝


      当函数的参数是对象时,传递的是引用类型,在对象函数内部的操作会影响到外边对象。 如果希望传递的是对象的一个拷贝时,这时就需要用到object的clone()方法。拷贝对象返回的是一个新对象,而不是引用;拷贝对象与new操作符返回的新对象的区别就是这个拷贝对象已经包含了原来对象的一些信息,而不是对象的初始信息。 什么时候使用shallow Clone(浅拷贝,影子拷贝),什么时候使用 deep clone(深拷贝):主要看具体域对象的性质是什么,如果是基本类型使用shallow clone ,如果是 reference variable(引用变量)使用deep clone 。

      在clone中分为浅拷贝和深拷贝,浅拷贝就是不管参数是基本类型还是引用类型,直接调用super.clone()进行拷贝,结果引用类型还是指向相同的内存;深拷贝就是在调用super.clone()之后,还要调用引用参数的clone()函数,进行拷贝,来达到深拷贝。

      浅拷贝:

      (1) 基本的数据类型(String)是会拷贝复制一份新的对象

      (2)引用对象还是引用同一份对象

      

    public class Shallow implements Cloneable {
    
        private Deep deep;
    
        @Override
        protected Shallow clone() throws CloneNotSupportedException {
            Shallow shallow = (Shallow) super.clone();
            //shallow.deep = deep.clone();浅复制
            return shallow;
        }
    }
    
    class Deep implements Cloneable {
    
        @Override
        protected Deep clone() throws CloneNotSupportedException {
            return (Deep) super.clone();
        }
    }

      深拷贝:

      (1)对存在的引用类型也进行拷贝

    public class Shallow implements Cloneable {
    
        private Deep deep;
    
        @Override
        protected Shallow clone() throws CloneNotSupportedException {
            Shallow shallow = (Shallow) super.clone();
            shallow.deep = deep.clone();//深复制
            return shallow;
        }
    }
    
    class Deep implements Cloneable {
    
        @Override
        protected Deep clone() throws CloneNotSupportedException {
            return (Deep) super.clone();
        }
    }
  • 相关阅读:
    mysql分表场景分析与简单分表操作
    Linux内嵌汇编
    window 和 linux x64差别
    sourcetree和gitlab配置图解
    QT如何管理组件(解决“要继续此操作,至少需要一个有效且已启用的储存库”问题)
    QT5.x应用在Mac OS X和Windows平台的发布过程
    python中读写二进制文件
    mysql分表的3种方法
    MySQL-C++封装类
    MySQL删除数据库时无响应解决办法
  • 原文地址:https://www.cnblogs.com/cmdra/p/5902706.html
Copyright © 2020-2023  润新知