- 浏览: 206589 次
- 性别:
- 来自: 紫禁城
文章分类
最新评论
-
a1439226817:
<!doctype html><html l ...
发布一个支持N级下拉列表联动的控件 -
a1439226817:
也不高个测试的demo,别人怎么用啊
发布一个支持N级下拉列表联动的控件 -
davaidgao:
不全啊,这是
Spring3.x权威开发指南 -
caizi12:
对于map绑定很是不方便,现在的做法,需要创建一User类,再 ...
浅谈 SpringMVC 数据绑定 -
joeyhuang:
不全啊..
Spring3.x权威开发指南
现在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对象,这样克隆类就和原始类共享了一部分信 息,而这样显然是不利的,过程下图所示:<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/Senton/%E6%9C%AA%E5%91%BD%E5%90%8D.bmp"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 386.25pt; HEIGHT: 198.75pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.it130.cn/Files/d6935ca561cf4f969134c597eb6437f6.png" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 386.25pt; HEIGHT: 198.75pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.it130.cn/Files/d6935ca561cf4f969134c597eb6437f6.png" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png"></imagedata></shape>
这个时候我们就需要进行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对象.
4. Clone()方法的使用
Clone()方法的使用比较简单,注意如下几点即可:
a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable
b. 调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException。
发表评论
-
Ubuntu下JDK+Tomcat+MySql环境的搭建
2011-06-15 14:48 1168Ubuntu 下 JDK+Tomcat+MySql ... -
Eclipse下切换 SVN 中已经保存的用户名和密码
2009-09-22 10:28 17391. 把 C:\Documents and Set ... -
Java实现汉字转换为拼音
2006-10-31 13:15 620import java.util.HashMap;import ... -
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
2008-12-16 10:32 742在多线程大师Doug Lea的贡献下,在JDK1.5中加入 ... -
Java读取Properties文件的六种方法
2009-04-16 09:34 740使用J2SE API读取Properties文件的六种方法 ... -
深入探讨java集合类
2006-08-24 20:47 729不同的集合在添加对象时的处理是不同的:Set:不允许重复,且没 ... -
递归在java语言中的应用
2006-08-25 09:21 1038一 . 两个小经验 1.在定义一个类时,不要随意定义成员变量 ... -
java类装载器
2006-08-25 18:36 870一 . 面向接口编程. 不要面向类编程. 二 . 关于异常:如 ... -
几个Java基础知识
2006-08-25 19:18 682一 . Hashtable和HashMap Hashtab ... -
面向方面的编程(AOP)
2006-08-25 19:33 747面向对象的编程(OOP)中 ... -
Collection与UML学习
2006-09-01 19:19 707一 . 属性<property>时须注意:1. & ... -
反射和代理
2006-09-01 19:23 715一. 关于数据库.当今的数据处理大致可以分成两大类:联机事务处 ... -
Jdk1.5的新语法和一些java学习的小知识点
2006-09-01 19:30 1232一.1. 操作系统执行具体 ... -
使用DatabaseMetaData和ResultSetMetaData查看数据库信息
2006-10-07 22:26 948/**DatabaseMetaData接口查看数据库的整体综合 ... -
自己动手写数据库连接池
2006-10-07 22:28 1050在前面的文章中已经说过使用连接池的很多好处和优势,也曾讨论过怎 ... -
BASE64编码
2006-10-24 08:39 13261.HttpServletRequest: 请求 ... -
一个实现MD5的简洁的java类
2006-10-28 22:27 665一个实现MD5的简洁的java类 package test; ... -
使用Java将Word转为Html或txt!
2006-10-31 13:47 1233package org.client; // 使用Java将W ... -
理解接口
2006-11-01 14:12 552... -
正则表达式中问号等特殊字符的转义
2006-11-10 00:26 2496正则表达式中问号等特殊字符的转义 除 .$ ^ { [ ( | ...
相关推荐
Java 深克隆与浅克隆 Java 中的克隆机制可以让我们方便地制造出一个对象的...Java 中的克隆机制可以方便地制造出对象的副本,但是需要注意浅克隆和深克隆的区别,并且需要正确地使用 Clone 方法,以避免不利的结果。
本文将深入探讨Java中的引用以及对象的克隆机制,包括浅拷贝和深拷贝的区别及其应用场景。 #### 二、Java中的引用 在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下...
总结来说,Java中的克隆机制对于复制对象和维护对象状态的独立性至关重要。浅克隆适用于不涉及复杂引用关系的对象,而深克隆则用于处理具有嵌套对象的情况,以确保对副本的修改不会影响原始对象。理解这两种克隆方式...
总之,Java的`clone`机制提供了复制对象的能力,通过实现`Cloneable`接口和覆盖`clone`方法,我们可以创建对象的副本,同时保证原对象不受影响。根据需求的不同,可以选择浅克隆或深克隆来处理对象及其引用的复杂性...
浅克隆是Java克隆机制的默认行为。当一个对象被克隆时,如果它的成员变量是基本类型(如int、double等),则这些成员变量会被逐个复制到新创建的对象中。然而,如果成员变量是引用类型(对象),那么新对象和原对象...
这种方法利用Java的序列化机制实现深度克隆。具体步骤如下: 1. **实现Serializable接口**:需要被克隆的类必须实现`Serializable`接口。 2. **序列化对象**:将对象转换为字节流。 3. **反序列化对象**:从字节流...
下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 clone方法顾名思义,就是复制,在Java语言中,clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源...
Java 提供了一个特殊的 clone() 方法,为所有的引用类型提供了一套标准的克隆机制。 Java 中的对象克隆可以分为两种类型:浅克隆(Shallow Cloning)和深克隆(Deep Cloning)。 浅克隆是指创建一个新的对象,并将...
总结来说,对象克隆是Java中用于复制对象的一种机制,分为浅克隆和深克隆,分别对应于是否深度复制对象内部的引用。实现克隆的关键是实现`Cloneable`接口并重写`clone()`方法。理解这两种克隆方式的区别和应用场景,...
Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...
Java的六个核心机制是编程中不可或缺的部分,它们包括克隆机制、序列化机制、多线程机制、反射机制以及垃圾回收机制和异常处理机制。在这篇文章中,我们将深入探讨前三个机制。 首先,克隆机制允许我们在内存中复制...
在Java编程语言中,克隆(Clone)是一种常见的对象复制机制。克隆可以分为浅克隆(Shallow Clone)和深克隆(Deep Clone)两种。浅克隆仅复制对象的引用,而深克隆则完全复制对象的所有属性。了解克隆的机制和类型对...
在Java编程语言中,`Clone`机制是一种对象复制的方式,允许创建一个现有对象的副本。在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy)...
Java中的对象创建主要有两种方式,即使用`new`操作符创建新对象以及通过`clone`方法复制已有对象。本文将从JVM的角度深入探讨Java的`clone`操作,揭示其工作原理及其潜在的问题。 首先,让我们理解`clone`方法的...