`
jaesonchen
  • 浏览: 313409 次
  • 来自: ...
社区版块
存档分类
最新评论

java对象复制之clone

 
阅读更多
public class ObjectClone implements Cloneable {
	private int i;
	private Handler handler = new Handler(101, "chenzq");
	public ObjectClone(int i) {
		this.i = i;
	}
	public void increase() {
		this.i++;
	}
	public void changeHandler(String str) {
		this.handler.setStr(str);
	}
	public int getI() {
		return this.i;
	}
	public Handler getHandler() {
		return this.handler;
	}
	@Override public Object clone() {
		ObjectClone o = null;
		try {
			o = (ObjectClone) super.clone();
		} catch (CloneNotSupportedException ex) {
			ex.printStackTrace();
		}
		o.handler = (Handler) o.handler.clone();
		return o;
	}
	public static void main(String[] args) {
		
		ObjectClone o = new ObjectClone(100);
		ObjectClone oc = (ObjectClone) o.clone();
		o.increase();
		System.out.println("o.i = " + o.getI() + ", oc.i = " + oc.getI());
		o.changeHandler("jaesonchen");
		System.out.println("o.handler = " + o.handler);
		System.out.println("oc.handler = " + oc.handler);
	}
}

class Handler implements Cloneable {
	private int j = 100;
	private String str = "default";
	public Handler() { }
	public Handler(int j, String str) {
		this.j = j;
		this.str = str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	@Override public Object clone() {
		Object o = null;
		try {
			o = super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return o;
	}
	@Override public String toString() {
		return "Handler.j = " + j + ", Handler.str = " + str;
	}
}

     输出为:

o.i = 101, oc.i = 100

o.handler = Handler.j = 101, Handler.str = jaesonchen

oc.handler = Handler.j = 101, Handler.str = chenzq

 

    * Object.clone()会检查原先的对象有多大,再为新对象腾出足够多的内存,将所有二进制位从原来的对象

       复制到新对象。
    * 对于基本数据类型,直接复制,对于引用类型,如果引用类型或其基类实现了Cloneable接口,则调用

      该对象的clone复制引用类型对象, 如果没有实现Cloneable接口,则直接复制对象句柄,实际上复制后

      的对象和原对象指向同一个引用类型。
    * 类或者基类必须实现标志空接口Cloneable,否则在调用clone方法时会抛出 

      CloneNotSupportedException异常。
    * 克隆时要注意的两个关键问题是:几乎肯定要调用super.clone(),以及注意将克隆设为public。
    * 调用Object.clone()时,根类中的clone()方法负责建立正确的存储容量,并通过“按位复制”

      二进制位从原始对象中复制到新对象的存储空间。也就是说,它并不只是预留存储空间以及复制

      一个对象 —— 实际需要调查出欲复制之对象的准确大小,然后复制那个对象。
    * 不管我们要做什么,克隆过程的第一个部分通常都应该是调用super.clone()。通过进行一次准确的复制,

      这样做可为后续的克隆进程建立起一个良好的基础。随后,可采取另一些必要的操作,以完成最终的

      克隆。

 

 

 

 

分享到:
评论

相关推荐

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    java 对象克隆

    总结,Java中的对象克隆是一项重要的功能,用于复制和独立化对象。通过实现`Cloneable`接口和覆盖`clone()`方法,我们可以创建浅克隆对象。对于更复杂的场景,可以自定义克隆逻辑或利用序列化来实现深克隆。理解并...

    java中的指针,引用及对象的clone

    Java中的对象克隆可以通过实现`Cloneable`接口并覆盖`clone()`方法来完成。对象的克隆分为浅拷贝和深拷贝两种形式。 **1. 浅拷贝** 浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新...

    java clone

    在Java编程语言中,`clone`是一个非常重要的概念,它涉及到对象复制和对象克隆。本文将深入探讨Java中的`clone`方法,包括其工作原理、使用场景、注意事项以及一些个人实践心得。 首先,让我们理解什么是`clone`。...

    JAVA_对象克隆

    1. 浅克隆:默认的`clone()`方法执行的是浅克隆,它创建的新对象只复制原始对象的基本数据类型字段,对于引用类型的字段,新对象和原始对象共享同一个引用。这意味着对引用对象的修改会影响到原始对象。 2. 深克隆...

    对象克隆(clone)详解.docx

    总结来说,对象克隆是Java中用于复制对象的一种机制,分为浅克隆和深克隆,分别对应于是否深度复制对象内部的引用。实现克隆的关键是实现`Cloneable`接口并重写`clone()`方法。理解这两种克隆方式的区别和应用场景,...

    java_clone用法

    在Java中,`clone`方法提供了一种快速复制对象的方式。它属于`Object`类的一部分,但需要显式地在子类中声明并实现`Cloneable`接口才能正常使用。本文将详细介绍`clone`的基本概念、工作原理以及如何实现浅拷贝和深...

    java 深克隆浅克隆

    克隆技术在处理复杂数据结构、避免对象共享以及实现对象复制等方面有着广泛的应用。Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,...

    java不同对象及集合的多次复制

    在Java编程中,对象复制是一项常见的任务,特别是在处理模型(Model)和视图对象(VO)时。模型对象通常用于封装业务数据,而视图对象则用于展示这些数据。值复制,即对象属性值的复制,是保持数据一致性和简化代码...

    java clone的小例子

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在对象复制和克隆方面。这个小例子将帮助初学者理解如何在Java中使用`clone()`来创建对象的副本。让我们深入探讨`clone()`方法以及它在实际编程中的...

    Java深浅clone

    因此,所有Java对象默认都具备`clone()`能力。但是,为了使用它,我们需要覆盖`clone()`方法,并且确保类实现了`Cloneable`接口,以避免抛出异常。 测试代码通常会包括以下步骤: 1. 实现`Cloneable`接口。 2. ...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    在MyBatis中,我们通常会定义Mapper接口和XML配置文件,映射SQL语句与Java对象之间的关系。如果需要在数据库操作后复制对象,可以在Mapper接口的方法中,或者在Service层中实现对象复制。 总的来说,Java中的对象...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和数据持久化时。本示例将深入探讨`clone()`方法的工作原理、使用场景以及如何在实际编程中应用。首先,我们来理解一下`clone()`方法的...

    如何进行Java对象的克隆.pdf

    "Java 对象克隆详解" Java 对象克隆是 Java 编程中一个重要的概念。由于 Java 中的对象使用引用类型,所以没有直接的方法可以将对象的内容复制到一个新的对象。Java 提供了一个特殊的 clone() 方法,为所有的引用...

    编程语言java对象复制.pdf

    在标题“编程语言java对象复制.pdf”和描述“编程语言java对象复制.pdf”中,明确指出了文档的主题是关于Java编程语言中对象复制的技术知识。在给出的内容部分中,通过具体的Java代码示例,讨论了在Java中实现对象...

    java对象复制.pdf

    Java对象复制是一个重要的...总的来说,Java对象复制是一个复杂的过程,需要考虑`clone()`方法的使用、`Cloneable`接口的实现以及浅拷贝和深拷贝的区别。在实际开发中,根据具体需求选择合适的复制方式是非常重要的。

Global site tag (gtag.js) - Google Analytics