java深度克隆_浅析Java中clone()方法浅克隆与深度克隆
现在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()方法浅克隆与深度克隆相关推荐
- java group类_浅析Java中线程组(ThreadGroup类)
Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...
- java 线程状态_浅析Java中的线程状态
一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...
- java变量同名_浅析Java中局部变量与成员变量同名解决技巧
要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中 ...
- Java的反射作用_浅析Java 反射机制的用途和缺点
反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ability to examin ...
- java 越来越慢_浅析Java语言慢的原因
Java在早期(比如JDK1.2以前)是很慢的,后续版本由于有许多优化手段的加入,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论.我想就我自己的理解,谈一下影响Java ...
- java expression 用法_浅析Java 8新特性Lambda Expression
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
- 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 ...
- java的cloneable_Java的Cloneable接口和clone方法
1. 克隆的用处 在日常编码中我们经常需要产生某个对象的副本,这里的副本并不是指向同一个对象的不同引用,而是与当前对象状态一模一样的另一个新的对象.如果使用单纯的引用赋值,会发生什么效果呢? 我们可以 ...
- 【百家稷学】深度学习在计算摄影中的方法与应用(vivo技术分享)
继续咱们百家稷学专题,本次是有三AI在vivo公司分享的技术讲座.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 分享主题 本次分享是在vivo AI研究院进行,主题是<深度学习在 ...
最新文章
- xsd的unique验证
- 【运筹学】线性规划数学模型 ( 单纯形法 | 最优解判定原则 | 线性规划求解示例 )
- 现在就是.Net最好的时代!我赞成,谁反对?
- Python+matplotlib绘制动态更新的柱状图
- 【报告分享】2021年小红书美妆护肤洞察报告.pdf(附下载链接)
- 数据库与Excel表格链接PHP,php读取Excel表格(Excel也可以做数据库)调用phpExcel类库...
- Exp7 网络欺诈防范 20154301仉鑫烨
- CentOS7通过定时脚本阻断异常IP连接SSH(实测)
- matlab滤波器函数6,matlab中滤波器函数filter的c语言实现
- Openlayers layer 切换底图
- linux 内核块设备驱动,linux之块设备驱动
- 怎么在电脑桌面添加待办便签小助手
- 基于单片机仿指针显示的电子时钟设计(毕业设计资料)
- 如何用WikiExtractor提取维基百科词汇
- 使用pandas和xlwt,xlrd结合操作excel实现自动化
- 计算机网络实验(华为eNSP模拟器)——第十一章 帧中继网络
- 一个很好用的小程序生成二维码海报的组件库
- XDOJ综合题 数字分解排序
- Java处理小数点精度
- 设置本计算机win7的网络参数,Win7本机IP地址设置图文教程
热门文章
- linux 更改wp版本号,代码实现移除 WordPress 版本号
- mysql 3.6.4_TOMCAT5+MYSQL5+JIRA3.6.4配置说明
- 【Netty】从 BIO、NIO 聊到 Netty
- Android Action Bar 详解篇
- 软件测试须知基于PostMan的接口自动化测试
- 今天谈一谈python自动化测试中使用异步
- oracle修改数据高性能,oracle数据库的性能调整
- 学Linux的你还在为正则表达式而挠头?
- 如何通过三视图判断立方体个数_如何看股票市盈率?怎么通过市盈率判断股票?...
- 如何用html语言定位img,html经常使用标签(图像标签img,连接标签a,锚点定位,及路径)...