当前位置: 首页 > news >正文

Java中的克隆(Clone)机制

转自:http://blog.csdn.net/Senton/archive/2007/08/03/1723826.aspx

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


1
 Clone&Copy
假设现在有一个Employee对象,

Employee tobby =new Employee(“CMTobby”,5000)

通常我们会有这样的赋值Employee cindyelf=tobby,这个时候只是简单了copy了一下referencecindyelftobby都指向内存中同一个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()方法的保护机制
ObjectClone()是被申明为protected的,这样做是有一定的道理的,以Employee类为例,通过申明为protected,就可以保证只有Employee类里面才能克隆”Employee对象.

4 Clone()方法的使用
Clone()
方法的使用比较简单,注意如下几点即可:
a
 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable
b
 调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException

相关文章:

  • Java读取Properties文件的六种方法
  • java序列化机制与原理
  • Eclipse-debug时常用的快捷键
  • java序列化原则
  • 网站统计中的数据收集原理及实现
  • Java枚举类型enum的原理
  • CentOS(七)--Linux文件类型及目录配置
  • Java枚举类型enum的使用原理
  • DateUtil
  • 深入研究java.lang.Class类
  • 候捷谈Java反射机制
  • Codeforces Beta Round #51 D. Beautiful numbers 数位dp
  • java的RTTI
  • (转)memcache、redis缓存
  • java的编译时多态和运行时多态
  • hexo+github搭建个人博客
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java多态
  • Java精华积累:初学者都应该搞懂的问题
  • Java-详解HashMap
  • Nacos系列:Nacos的Java SDK使用
  • scrapy学习之路4(itemloder的使用)
  • vue脚手架vue-cli
  • Webpack 4 学习01(基础配置)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 阿里研究院入选中国企业智库系统影响力榜
  • 百度地图API标注+时间轴组件
  • 第十八天-企业应用架构模式-基本模式
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 三栏布局总结
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 在weex里面使用chart图表
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 数据库巡检项
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (6)添加vue-cookie
  • (附源码)php投票系统 毕业设计 121500
  • (七)c52学习之旅-中断
  • (数据结构)顺序表的定义
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .gitignore
  • .NET Micro Framework初体验(二)
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [.net] 如何在mail的加入正文显示图片
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [IE技巧] 让IE 以全屏模式启动