以下文字转自:桔子园 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做特殊处理,如下代码所示:

[java] view plaincopyprint?
  1. class Employee implements Cloneable
  2. {
  3. public Object clone() throws CloneNotSupportedException
  4. {
  5. Employee cloned = (Employee) super.clone();
  6. cloned.hireDay = (Date) hireDay.clone()
  7. return cloned;
  8. }
  9. }

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() 浅克隆与深度克隆(转)相关推荐

  1. 原型模式 —— Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

  2. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  3. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  4. java deep clone util_实现对象深度克隆(deepClone)的三种方案

    转:http://www.cnblogs.com/wangzhichao/archive/2013/04/11/3014419.html 方案一:利用现代浏览器支持的JSON对象做一次中转,实现深度克 ...

  5. java深度克隆_Java深入学习26:Java深度克隆

    Java深入学习26:Java深度克隆 深克隆和浅克隆区别 浅克隆: 只copy对象引用,不copy对象本身.即对象地址不变,仍然只存在一个对象. 深克隆: 不仅拷贝对象本身,而且拷贝对象包含的引用指 ...

  6. Java对象的深度克隆

    文章目录 前言 代码 后记 前言 日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次.这里我不重写c ...

  7. java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用

    ‍        我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 ...

  8. java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...

  9. java clone() 方法详解及深克隆与浅克隆

    概述 clone 翻译过来就是 克隆,顾名思义就是创造一个一模一样的事物.Java 代码中 clone() 方法是 Object 方法,而 Object 又是所有类的父类,也就是说所有 java 对象 ...

最新文章

  1. Linux常见命令(二)
  2. 2012年度IT博客大赛50强报道:马博峰
  3. 基于 gRPC 和 .NET Core 的服务器流
  4. 【转】DICOM通信 - PDU数据包(1)
  5. cutterman工具使用 0921
  6. 裕-C#过滤DataTable中的空数据和重复数据
  7. java 降低jdk版本_jdk1.7降级到1.6 | 学步园
  8. unity 贴图设置
  9. JAVA语言isPrime关键词_Java Guava IntMath isPrime()用法及代码示例
  10. 台式计算机显卡驱动位置,惠普台式电脑怎么安装显卡驱动
  11. java将ppt转换成图片,图片以幻灯片的备注命名
  12. 小区人脸识别门禁系统解决方案
  13. 每个产品经理都应该了解的5大技术技能
  14. 想要快速绘制3D图纸?这些“私人定制”不可少!
  15. .netCore微信转账至零钱——V3
  16. WP_支持XP的Windows Phone开发环境搭建:“文字+视频”教程(五)
  17. 科普|新消费时代,Martech 永远的神?
  18. pdf to word android,PDF to Word Converter
  19. python+微信+腾讯智能闲聊
  20. Java实现单次转账到支付宝账户(新版接口)(SpringBoot)

热门文章

  1. c语言常量x,C语言的数据、常量和变量
  2. 中间显示内容_在Excel表格中,你知道编辑栏吗?可以编辑公式和录入内容
  3. python连连看小游戏_请用PYTHON编一个小游戏,如五子棋,连连看,贪吃蛇,扫雷,计算器等等...
  4. 保益悦听怎么开盲人模式_盲人看电影???是的!盲人看电影!!!
  5. java entity公共属性_java – 如何从Entity Manager获取jpa数据源属性
  6. java泛型(一)、泛型的基本介绍和使用
  7. 关于用notepad++确认代码中\r\n\t空格等不显示的字符及替换
  8. python Logging日志记录模块详解
  9. 查找列表元素的最大最小值(python)
  10. storm-kafka源码分析