内容转自:http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html

现在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。

最新文章

  1. Redis 哨兵模式实现主从故障互切换
  2. NLTK中文语料库sinica_treebank
  3. Centos 如何安装Django环境
  4. 小组开发项目针对性的NABC分析
  5. C#序列化XML至对象
  6. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试][关于电梯调度算法的附加思考]:刘耀先-11061183,罗凡-11061174
  7. CSDN-Markdown语法集锦
  8. Android学习之RecyclerView
  9. Redhat Enterprise server 6.3 构造VPN
  10. scrapy设置"请求池"
  11. java中处理json各种各样转换方法
  12. rest framework 认证 权限 频率
  13. Python的基本类型介绍和可变不可变
  14. Java多线程之二(Synchronized)
  15. 学生与部门管理app-产品功能与界面的简单设计
  16. 12,13,14节-51单片机ESP8266学习-AT指令(暂停更新)需要整理
  17. RHEL7 配置iSCSI模拟环境
  18. [内核驱动] miniFilter 内核层与应用程序通信
  19. js 获取数组重复的元素
  20. VMware快照的工作原理

热门文章

  1. HTML绝对路径和相对路径
  2. 20个网页设计师应该学习的CSS3经典教程实例
  3. 如何在iview组件中使用jsx
  4. PHP new StdClass() 创建空对象
  5. C# 将html文本转化为 文本内容方法TextNoHTML
  6. 使用WICleanup清理Windows Installer 冗余文件
  7. arcgis for js/flex/sl 该选哪一个?
  8. MUI框架-05-用MUI做一个简单App
  9. AndroidStudio中logcat不输出信息
  10. css 之单行文本显示省略和多行文本省略