zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    分析建模中的行为分析
    SOLID总结(未完待续)
    分析建模的五个子过程中为什么有个编码子过程?
    用例建模的五个子过程
    类之间的关系
    python cx_Freeze安装详解、打包exe文件简解
    pyautoit:OSError: [WinError 193] %1 不是有效的 Win32 应用程序
    Python 动态导入类并运行其中的方法
    比较2个字符串,输出看起来一样,但比较起来不同
    pyautogui 文档(五):截图及定位功能
  • 原文地址:https://www.cnblogs.com/cmdra/p/5902706.html
Copyright © 2011-2022 走看看