Java中的克隆(Clone)机制

转载 2007年09月24日 18:52:00

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克隆对象clone()的用法和作用

内容摘要若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克隆”的意...
  • u012975705
  • u012975705
  • 2015年12月09日 10:02
  • 11413

java的clone() 深克隆与浅克隆的区别

克隆的目的:快速创建一个已有对象的副本。 克隆的步骤: 创建一个对象将原有对象的数据导入到新创建的数据中 1. Object的clone()源代码简介 ...
  • u012129558
  • u012129558
  • 2016年05月16日 16:36
  • 1454

java之克隆一个对象(此对象包含list引用)-clone()

在java克隆的时候,所要克隆的对象包含比较复杂的数据结构如:list集合等一些复杂的引用的时候,该怎么克隆。 深克隆,浅克隆的实现和理解。...
  • qq_27093465
  • qq_27093465
  • 2015年11月09日 16:09
  • 5484

java clone和深度复制和浅复制的个人总结

1.clone() 和“=”的比较 在基本类型变量里的赋值如: int  a = 1;int b = a;a与b有相同的值,改变a或b的值不影响彼此。 在java中,对象间的:java.util.Da...
  • sinat_33327772
  • sinat_33327772
  • 2015年12月12日 12:08
  • 1907

Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨

原文:http://kentkwan.iteye.com/blog/739514 Part I 没啥好说的,直接开始Part II吧。   Part II 谈...
  • YiZhiCXY
  • YiZhiCXY
  • 2016年05月13日 21:40
  • 2151

JAVA中的深度克隆(deep clone) 和 影子克隆(shallow clone)浅析

JAVA中的深度克隆(deep clone) 和 影子克隆(shallow clone)浅析
  • angry_tiger
  • angry_tiger
  • 2016年04月11日 11:45
  • 594

JAVA对象任意深度克隆clone工具类分享

JAVA对象任意深度克隆clone工具类分享 源代码下载地址:http://www.zuidaima.com/share/1550463408114688.htm...
  • springmvc_springdata
  • springmvc_springdata
  • 2014年09月24日 09:46
  • 3755

java实现深克隆(如HashMap等)

克隆就是复制一个对象的复本.但一个对象中可能有基本数据类型,如:int,long,float    等,也同时含有非基本数据类型如(数组,集合等) 被克隆得到的对象基本类型的值修改了,原对象的值不会...
  • darkdragonking
  • darkdragonking
  • 2015年01月30日 19:59
  • 2562

数组克隆及对象的深、浅克隆(deep clone、shallow clone)

数组克隆及对象的深、浅克隆
  • theworldsong
  • theworldsong
  • 2014年04月09日 21:08
  • 1424

【Java提高】Java中是如何实现克隆

克隆,想必大家都有耳闻,世界上第一只克隆羊多莉就是利用细胞核移植技术将哺乳动物的成年体细胞培育出新个体,甚为神奇。其实在Java中也存在克隆的概念,即实现对象的复制。 本文将尝试介绍一些关于Ja...
  • hj7jay
  • hj7jay
  • 2016年05月18日 09:28
  • 2475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的克隆(Clone)机制
举报原因:
原因补充:

(最多只允许输入30个字)