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)机制

  • 2007-07-16 09:55
  • 48KB
  • 下载

Java中的克隆(Clone)机制

转自:http://blog.csdn.net/Senton/archive/2007/08/03/1723826.aspx现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火...

java对象克隆clone

转载请注明出处:http://blog.csdn.net/mazhimazh/article/details/16828505 在使用克隆时,我们需要知道使用的目的:就是为了快速构造一个和已有对...

java克隆对象clone()的用法和作用

内容摘要 若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克...

java使用serializable进行序列化与反序列化实现对象clone(克隆)

相信很多同学都使用过serializable,相信在项目中一般你的项目经理肯定和你说过记得在你的domain的类中实现serializable,不然有时会出现一些错误。但是serializable具体...

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

JAVA对象任意深度克隆clone工具类分享 源代码下载地址:http://www.zuidaima.com/share/1550463408114688.htm

11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记

 11.11 对象克隆技术 clone 11.12 Arrays类 11.13 Comparable接口           11.13.1 比较器的基本应用  ...

JAVA 复制对象时为什么要用克隆clone()而不用“=”的原因

今天一直很纠结为什么java里面有个clone()方法,复制对象时直接“=”不就行了,为什么还要在每个类里面重写clone方法。     Google了下,发现这个是典型的先学C/C++后再学JAVA...

JAVA 对象克隆clone

有时候我们希望克隆一个已存在的对象,并对其进行操作,但是不希望改变原对象,这时使用clone技术就非常方便了。但是使用clone,也有一些需要注意的地方,因为clone有浅层克隆和深层克隆。还是习惯先...

Java克隆(Clone)的应用

转载: 首先说明、:这是小弟转载。文章写得好,嘿嘿。 版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 Java克隆(Clone)的应用     简介:   Ja...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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