1.什么是Clone?
简单地说,Clone就是对于给定的一个对象实例 o ,得到另一个对象实例 o’ : o 与 o’ 类型相同( o.getClass() == o’.getClass() ),内容相同(对于 o/o’ 中的字段 f ,如果 f 是基本数据类型,则 o.f == o’.f ;如果 f 是对象引用,则 o.f == o’.f 或 o.f 指向的对象与 o’.f 指向的对象的内容相同)。通常称 o’ 为 o 的克隆或副本。
2.什么时候使用Clone?
当需要修改对象属性,又不想影响原来的属性值,这时候就应该使用clone了。
3.Java 对 clone 的支持
万类之初的 Object 类有 clone() 方法:
protected native Object clone() throws CloneNotSupportedException;
该方法是 protected 的,显然是留待被子类 override 的。该方法又是 native 的,必然做了与具体平台相关的底层工作。
事实上,类 Object 的 clone() 方法首先会检查 this.getClass() 是否实现了 Cloneable 接口。
Cloneable 只是一个标志接口而已,用来标志该类是否有克隆功能。
public interface Cloneable {
}
如果 this.getClass() 没有实现 Cloneable 接口, clone() 就会抛 CloneNotSupportedException 返回。否则就会创建一个类型为 this.getClass() 的对象 other ,并将 this 各 field 的值赋值给 other 的对应 field ,然后返回 other 。
如此一来,我们要定义一个具有 Clone 功能的类就相当方便:
1.在类的声明中加入“ implements Cloneable ”,标志该类有克隆功能;
2.Override 类 Object 的 clone() 方法,在该方法中调用 super.clone() :
4.shallow clone and deep clone
Clone是如何完成的呢?Object在对某个对象实施Clone时对其是一无所知的,它仅仅是简单地执行域对域的copy,这就是Shallow Clone。Java Collection 类库中具体数据结构类( ArrayList/LinkedList , HashSet/TreeSet , HashMap/TreeMap 等)都具有克隆功能,且都是 Shallow Clone。在有种情况下,这种shallow Clone就会问题,这个情况就是当,要clone的对象中的某个属性是一个引用, 这样克隆类就和原始类共享了一部分信息,对这个属性操作就会影响原始类,所以就需要deep clone.
deep clone的简单例子:
public class TestClone {
/**
* @param args
*/
public static void main(String[] args) {
try {
new TestClone().cloneObject();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void cloneObject() throws CloneNotSupportedException {
Person p = new Person();
Man man = new Man();
man.setSalory("111123");
p.setName("zhangfei");
p.setMan(man);
//man.setSalory("122335");//(1)
Person pp = p.getClonePerson(p);
man.setSalory("122335");//(2)
pp.setName("aa");
System.out.println("pp.getName()= " + pp.getName() + " pp.man.getSalory()= "+pp.getMan().getSalory());
System.out.println("p.getName()=" + p.getName()+" p.man.getSalory()= "+p.getMan().getSalory());
}
}
class Person implements Cloneable {
private String name = "";
private Man man;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person getClonePerson(Person p) throws CloneNotSupportedException {
Person pp = (Person) p.clone();
return pp;
}
public Man getMan() {
return man;
}
public void setMan(Man man) {
this.man = man;
}
public Object clone() throws CloneNotSupportedException{
Person p = (Person) super.clone();
p.man = this.getMan().getCloneMan(this.getMan());
return p;
}
}
class Man implements Cloneable{
private String salory = "";
public String getSalory() {
return salory;
}
public void setSalory(String salory) {
this.salory = salory;
}
public Man getCloneMan(Man man) throws CloneNotSupportedException{
Man ma = (Man)man.clone();
return ma;
}
}
将注释(1),(2)替换注释后,看看输出结果。
转载:http://onlylove.iteye.com/blog/265113
分享到:
相关推荐
现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的...
总之,Java的`clone`机制提供了复制对象的能力,通过实现`Cloneable`接口和覆盖`clone`方法,我们可以创建对象的副本,同时保证原对象不受影响。根据需求的不同,可以选择浅克隆或深克隆来处理对象及其引用的复杂性...
1. Java clone机制和工厂模式的应用(1.1节): - clone()方法的重写和使用。 - 工厂方法设计模式在创建对象时的应用,以达到解耦合和提高代码复用的目的。 - 利用clone()方法进行对象深拷贝和浅拷贝的区别和实现...
在Java编程语言中,`Clone`机制是一种对象复制的方式,允许创建一个现有对象的副本。在Java中,对象的默认复制是浅复制(shallow copy),这意味着只复制对象本身,而不复制它引用的对象。要实现深复制(deep copy)...
Java中的`clone`方法是Java语言提供的一种复制对象的机制,它允许创建一个现有对象的副本,这个副本具有与原始对象相同的状态,但它们是独立的实体,对其中一个对象的修改不会影响另一个。`clone`方法是Java `Object...
Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...
本文将深入探讨Java中的引用以及对象的克隆机制,包括浅拷贝和深拷贝的区别及其应用场景。 #### 二、Java中的引用 在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下...
下面我们将详细介绍Java中的clone方法,并讨论它的实现机制和应用场景。 什么是clone方法 clone方法顾名思义,就是复制,在Java语言中,clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源...
首先,让我们理解`clone`方法的工作机制。在Java中,`clone`方法是`Object`类的一个受保护的方法,这意味着所有Java对象都隐含地继承了这个方法。然而,`Object`类的`clone()`方法执行的是浅克隆,即如果对象包含...
Java中的克隆(Clone)机制是面向对象编程中一种创建对象副本的方法,它允许程序员创建一个已有对象的新实例,新实例的数据与原对象相同。在Java中,克隆分为两种类型:浅克隆(Shallow Clone)和深度克隆(Deep ...
### Java 高级特性详解 #### 一、`hashCode` ...正确地重写 `equals` 和 `hashCode` 方法、使用 `Comparator` 进行排序、利用反射机制和序列化技术,以及实现 `clone` 方法都是开发高质量 Java 应用程序的重要技能。
Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...
Java的克隆机制通过`Object.clone()`方法实现,该方法位于`java.lang.Object`类中。 **1.2 实现要求** - **实现`Cloneable`接口**:被克隆的类必须实现`Cloneable`接口,表明该类支持克隆操作。 - **重写`clone()`...
Java 语言中的六个核心机制包括克隆、序列化、多线程、异常处理、垃圾回收以及反射。在这里,我们将详细探讨前三个机制。 首先,让我们来看看克隆机制。克隆在编程中指的是复制一个对象并在内存中创建其副本。在 ...