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();
        }
    }
  • 相关阅读:
    [开源项目]蓝点无限TWR算法-多基站多标签固件
    [开源项目] 蓝点无限 UWB Python版本上位机
    记一次RabbitMQ的脑裂(网络分区)问题
    使用Docker持久化部署SQL Server
    .NET---Exceptionless 轻量级的分布式日志管理平台
    python性能测试工具locust
    Javascript —— 线转树 or 树转线
    记录一个生僻知识点 —— JS字符模板替换
    车证识别工具|行驶证识别工具|行驶证识别OCR工具免费版V3.0.0.0
    C# CAD 凹凸点识别最大轮廓
  • 原文地址:https://www.cnblogs.com/cmdra/p/5902706.html
Copyright © 2011-2022 走看看