现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在Java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看Java中的Clone机制是如何工作的?

1. Clone&Copy

假设现在有一个Employee对象,Employee tobby =new Employee(“CMTobby”,5000),通

常我们会有这样的赋值Employee cindyelf=tobby,这个时候只是简单了copy了一下reference,cindyelf和tobby都指向内存中同一个object,这样cindyelf或者tobby的一个操作都可能影响到对方。

打个比方,如果我们通过cindyelf.raiseSalary()方法改变了salary域的值,那么tobby通过getSalary()方法得到的就是修改之后的salary域的值,显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝,同时两者互不影响,这时候我们就可以使用Clone来满足我们的需求。

Employee cindy=tobby.clone(),这时会生成一个新的Employee对象,并且和tobby具有相同的属性值和方法。

2. Shallow Clone&Deep Clone

Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。

这样,问题就来了咯,以Employee为例,它里面有一个域hireDay不是基本型别的变量,而是一个reference变量,经过Clone之后就会产生一个新的Date型别的reference,它和原始对象中对应的域指向同一个Date对象,这样克隆类就和原始类共享了一部分信息,而这样显然是不利的,过程下图所示:

这个时候我们就需要进行deep Clone了,对那些非基本型别的域进行特殊的处理,例如本例中的hireDay。我们可以重新定义Clone方法,对hireDay做特殊处理,如下代码所示:

class Employee implements Cloneable

{

public Object clone() throws CloneNotSupportedException

{

Employee cloned = (Employee) super.clone();

cloned.hireDay = (Date) hireDay.clone()

return cloned;

}

}

3. Clone()方法的保护机制

在Object中Clone()是被申明为protected的,这样做是有一定的道理的,以Employee

类为例,通过申明为protected,就可以保证只有Employee类里面才能“克隆”Employee对象,原理可以参考我前面关于public、protected、private的学习笔记。

4. Clone()方法的使用

Clone()方法的使用比较简单,注意如下几点即可:

a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable

b. 调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException。

希望本篇文章可以帮助到小伙伴们

java深度克隆_浅析Java中clone()方法浅克隆与深度克隆相关推荐

  1. java group类_浅析Java中线程组(ThreadGroup类)

    Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...

  2. java 线程状态_浅析Java中的线程状态

    一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...

  3. java变量同名_浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...

  4. Java的反射作用_浅析Java 反射机制的用途和缺点

    反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...

  5. java 越来越慢_浅析Java语言慢的原因

    Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...

  6. java expression 用法_浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

  7. java中clone方法_Java Object clone()方法– Java中的克隆

    java中clone方法 Cloning is the process of creating a copy of an Object. Java Object class comes with na ...

  8. java的cloneable_Java的Cloneable接口和clone方法

    1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...

  9. 【百家稷学】深度学习在计算摄影中的方法与应用(vivo技术分享)

    继续咱们百家稷学专题,本次是有三AI在vivo公司分享的技术讲座.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 分享主题 本次分享是在vivo AI研究院进行,主题是<深度学习在 ...

最新文章

  1. xsd的unique验证
  2. 【运筹学】线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 线性规划求解示例 )
  3. 现在就是.Net最好的时代!我赞成,谁反对?
  4. Python+matplotlib绘制动态更新的柱状图
  5. 【报告分享】2021年小红书美妆护肤洞察报告.pdf(附下载链接)
  6. 数据库与Excel表格链接PHP,php读取Excel表格(Excel也可以做数据库)调用phpExcel类库...
  7. Exp7 网络欺诈防范 20154301仉鑫烨
  8. CentOS7通过定时脚本阻断异常IP连接SSH(实测)
  9. matlab滤波器函数6,matlab中滤波器函数filter的c语言实现
  10. Openlayers layer 切换底图
  11. linux 内核块设备驱动,linux之块设备驱动
  12. 怎么在电脑桌面添加待办便签小助手
  13. 基于单片机仿指针显示的电子时钟设计(毕业设计资料)
  14. 如何用WikiExtractor提取维基百科词汇
  15. 使用pandas和xlwt,xlrd结合操作excel实现自动化
  16. 计算机网络实验(华为eNSP模拟器)——第十一章 帧中继网络
  17. 一个很好用的小程序生成二维码海报的组件库
  18. XDOJ综合题 数字分解排序
  19. Java处理小数点精度
  20. 设置本计算机win7的网络参数,Win7本机IP地址设置图文教程

热门文章

  1. linux 更改wp版本号,代码实现移除 WordPress 版本号
  2. mysql 3.6.4_TOMCAT5+MYSQL5+JIRA3.6.4配置说明
  3. 【Netty】从 BIO、NIO 聊到 Netty
  4. Android Action Bar 详解篇
  5. 软件测试须知基于PostMan的接口自动化测试
  6. 今天谈一谈python自动化测试中使用异步
  7. oracle修改数据高性能,oracle数据库的性能调整
  8. 学Linux的你还在为正则表达式而挠头?
  9. 如何通过三视图判断立方体个数_如何看股票市盈率?怎么通过市盈率判断股票?...
  10. 如何用html语言定位img,html经常使用标签(图像标签img,连接标签a,锚点定位,及路径)...