链接克隆 完整克隆

在继续克隆概念之前,让我们用对象创建概念刷新基础知识。 使用new运算符创建对象时,对象将在堆中获取内存分配。

堆中的对象创建

在Java中,理想情况下仅通过引用变量修改对象,即仅复制对象的内存地址,因此原始对象中的任何更改都将反映在新变量中。

Glass objGlass1 = new Glass();

Glass objGlass2 = objGlass1;

在这种情况下,在这种情况下,您对对象objGlass1所做的任何更改都会反映在对象objGlass2中 ,反之亦然。 这意味着' objGlass1 == objGlass2 '将返回true,这两个引用变量objGlass1objGlass2都引用同一对象。 但是,如果您打算复制对象而不是仅复制对象的引用,则需要克隆。

什么是克隆?

克隆是复制对象的过程,即通过复制自身来创建新实例。 Java中的克隆可以通过使用对象的clone()方法来完成。

克隆使用相同的类和所有字段具有相同的值来创建并返回对象的副本。

Glass objGlass1 =新的Glass();

玻璃objGlass2 =(玻璃)objGlass.clone();

克隆后,让我们看下面的分析:

  • objGlass1!= objGlass2返回TRUE,这意味着objGlass1objGlass2引用两个不同的内存位置,即两个不同的对象。
  • objGlass1.getClass()== objGlass2 .getClass()返回TRUE,这意味着克隆的对象和原始对象应为同一类型。
  • objGlass1.equals(objGlass2)返回TRUE,表示克隆的对象数据应等于原始数据(但是克隆后随时可以更改)。

浅克隆与深克隆

Java支持两种克隆类型–浅克隆和深克隆。

如果是“ 浅”克隆,则会创建一个新对象,该对象具有原始对象中值的精确副本。 Object的clone()方法提供了浅层克隆。 在这种克隆机制中,将复制对象而不包含其包含的对象。

浅克隆仅复制对象的顶层结构,而不复制较低层。

结构形式

浅克隆结构

在上图中, OriginalObject1具有Field1和一个包含的对象,称为ReferenceObject1 。 现在,在浅克隆OriginalObject1过程中,将使用具有从Field1复制的值的Field2创建ClonedObject2 ,它仍指向ReferenceObject1 。 这背后的原因是Field1是原始类型,因此将其值复制到Field2中 。 但是,由于ReferenceObject1是对象类型,因此ClonedObject2指向相同的ReferenceObject1

ReferenceObject1所做的任何更改将可见ClonedObject2

浅克隆结构

如果是深度克隆 ,则复制所有字段。 在这种情况下,即使引用的对象也将与字段一起复制到克隆的对象中。

深克隆结构

如上图所示, OriginalObject1具有基本类型Field1ReferenceObject1 。 现在,当我们做OriginalObject1然后ClonedObject2字段2是具有从Field 1和ReferenceObject2含有ReferenceObject1的复制值复制的值创建沿的深克隆。

深克隆结构

浅克隆示例:

浅克隆示例

浅克隆示例

在上面的示例中,我们有一个原始对象Employee,它引用了Department类和一个字段EmployeeName 。 首先,假设EmployeeName =“ Chris”和DepartmentName =“ Sales”的值。 当我们通过“浅层克隆”克隆对象Employee时,将创建一个ClonedEmployee对象,该对象具有一个重复的字段,克隆了EmployeeName和Department。 但是,我们需要注意的是,没有创建重复的Department对象。 克隆的Employee对象引用与所引用类Department相同的内存地址。

因此,现在当我们将EmployeeName的原始对象值更改为“ Peter”,将DepartmentName的原始对象值更改为“ Finance”时,克隆的EmployeeName字段将不会更改。 它仍然包含旧值(根据图表的上述部分)。 但是,我们必须注意,克隆的DepartmentName现在已修改为“ Finance”以反映更改。 这是因为克隆的Employee引用与原始对象相同的内存地址。 因此,对原始对象引用所做的任何更改对于引用原始对象的克隆对象也是可见的。 它不会像字段一样重复。

浅克隆的代码示例

Department.java (ReferenceObject)

public class Department {private String deptName;public Department(String str) {deptName = str;}public String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}
}

Employee.java (主对象)

public class Employee implements Cloneable {private String employeeName;private Department dept;public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public Department getDept() {return dept;}public void setDept(Department dept) {this.dept = dept;}public Employee(String emp, String empDept) {employeeName = emp;dept = new Department(empDept);}public Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}

客户端程序

public static void main(String[] args) {Employee emp = new Employee('Chris', 'Sales');System.out.println('Original Object value - Employee Name:'+ emp.getEmployeeName() + ' & department name:'+ emp.getDept().getDeptName());Employee clonedEmployee = (Employee) emp.clone();System.out.println('Cloned object value - Employee Name:'+ clonedEmployee.getEmployeeName() + ' & department name:'+ clonedEmployee.getDept().getDeptName());// Now let's change values of Original Objectemp.setEmployeeName('Peter');emp.getDept().setDeptName('Finance');System.out.println('Original Object value after it is modified - Employee Name:'+ emp.getEmployeeName()+ ' & department name:'+ emp.getDept().getDeptName());System.out.println('Cloned object value after modification of original object' +' - Employee Name:'+ clonedEmployee.getEmployeeName()+ ' & department name:'+ clonedEmployee.getDept().getDeptName());}

深克隆实例

深克隆实例

与深度克隆不同,在进行深度克隆的情况下,原始对象的所有字段都将复制到克隆对象,包括原始对象引用的对象。 此过程将复制由字段指向的动态分配的内存。

在上面的示例中,即使原始对象被修改并且其值被更改,克隆对象也不会被更改,包括参考对象值,因为它不引用相同的存储器地址。

深克隆代码示例:

在进行深度克隆的情况下,唯一的更改发生在clone()方法中。 与浅克隆不同,不调用super.clone()方法,而是使用clone()方法内部的new运算符创建对象。

public Object clone() {//Deep Copy processEmployee e = new Employee(employeeName, dept.getDeptName());return e;
}

希望您喜欢这篇文章。 请随时提供您的反馈和意见。

参考:在Idiotechie博客上,我们的JCG合作伙伴 Mainak Goswami 深入探讨了克隆 。

翻译自: https://www.javacodegeeks.com/2012/11/deep-diving-into-cloning.html

链接克隆 完整克隆

链接克隆 完整克隆_深入克隆相关推荐

  1. 动物克隆技术应用价值_动物克隆技术论文

    第 1 页 ( 共 6 页 ) 动物克隆技术 [摘要]: 本文主要针对动物克隆和植物克隆技术的产生以及发展来阐述克隆所带 来的利与弊,并从生物技术的发展和社会道德.人性等方面所存在的问题展开论述. 克 ...

  2. 动物克隆技术应用价值_虽然有了克隆技术为什么要进行克隆呢

    为什么要进行宠物克隆? 芭芭拉·史翠珊作为全球唯一一位同时拥有奥斯卡奖.托尼奖.格莱美奖.艾美奖.金球奖多个权威奖项的艺术家,在宠物克隆方面曾经写道:"如果你花足够的时间阅读关于宠物克隆的文 ...

  3. 联想小新Air14使用傲梅分区助手进行硬盘克隆出现的问题,克隆完显示RAW格式解决方案,win10家庭版硬盘BitLocker上锁解锁方法

    联想小新Air14使用傲梅分区助手进行硬盘克隆出现的问题,克隆完显示RAW格式解决方案 买电脑时没考虑到512会不够用,也没注意到小新Air14是单插槽的,所以有了今天的故事. 本文会就自己的经历,提 ...

  4. 【WMWare 克隆CentOS虚拟机 】解决克隆后 ip 冲突 主机名重复问题

    前言: 当我需要搭建数据库主从复制集群时,不想再重新安装一遍 mysql ,于是将安装好 mysql 的虚拟机克隆一份 一.克隆方法 鼠标右击虚拟机 ----> 管理 ----> 克隆 ( ...

  5. ue4 无限地图_如何使用UE4创建完整游戏地图_资源库

    摘要:如何使用UE4创建完整游戏地图_资源库 地图与场景就是整个副本的舞台,任何的玩法.战斗.剧情等方面都需要借助地图与场景来展现.所以但对于想要设计游戏的人来说,游戏地图的创建非常重要.你想要运用U ...

  6. matlab rawdata,利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone.pdf

    利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 _ Capbone 2015/10/20 利用 Matlab 和 Dcraw 处理数码相机 Raw 文件的完整流程 | Cap ...

  7. c语言 filetype ppt,c语言完整课件_图文.ppt

    c语言完整课件_图文 C语言程序设计 第1章 概论 第2章 数据类型.运算符与表达式 第3章 顺序结构程序设计 第4章 选择结构程序设计 第5章 循环结构程序设计 第6章 数组 第7章 函数 第8章 ...

  8. gi克隆github文件_如何构建GitHub文件搜索功能的克隆

    gi克隆github文件 In this article, we will build a project that mimics the lesser known but awesome file ...

  9. 取消挂载点可以节省磁盘么_磁盘克隆、磁盘镜像还有复制粘贴有什么不一样?...

    最近在倒腾新SSD和用了三四年的老操作系统,期间在磁盘上创建个新的分区,并且安装了一个全新的Windows10,结果,一不小心覆盖了老系统的引导,系统丢了.然后,用各种引导工具进行了修复,好在几次有惊 ...

最新文章

  1. 从FM推演各深度学习CTR预估模型
  2. SAP Spartacus里Commerce后台CMS Component和前台Angular的一一映射关系
  3. sqoop2安装详细过程[截图说明]
  4. 没有一个产品,竟捞金200亿!2021年最大胆设想,已沦为圈钱工具
  5. Python学习(十)Python 函数
  6. java个人中心修改界面怎么整_怎么对个人中心页面访问进行控制
  7. pycharm如何修改文件名
  8. java 求百分比_java中计算百分比
  9. C/S和B/S和RIA
  10. [转]应该被记住的天才,写在图灵诞辰100周年
  11. mysql or 索引失效_MySQL索引失效的几种情况详析
  12. 计算机主板的结构平面草图,10分钟浓缩10年 教你看懂主板基本结构
  13. 创意h5案例作品展示:谁是王牌拆弹专家
  14. 软件工程小组需求分析--快递代领
  15. HTML元素的水平/垂直居中方式(简单代码和图)
  16. GPS问题调试—MobileLog中有关GPS关键LOG的释义
  17. 全排列的递归算法(C语言)
  18. [ERROR][logstash.agent] Failed to execute action {:action=>LogStash
  19. 第1阶段——关于u-boot目标文件start.o中.globl 和.balignl理解(3)
  20. linux cred管理

热门文章

  1. dom4j读取XML文件内容
  2. Spring Boot中mapper包所放位置的配置
  3. ssm创建一个查询接口
  4. 都忘了自己还有一套房子了。。。
  5. 某同学工作之后的感悟
  6. 优秀学生专栏——李浩然
  7. 第五章循环结构(一)
  8. 最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
  9. css 图片换行_好程序员web前端学习路线分享CSS浮动-文档流篇
  10. windows监控txt写入_Windows的bug们