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

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)机制

    现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看java中的Clone机制是如何工作的...

    java克隆对象(两种方法)

    java的两种深度克隆方法,1cloneTest是用Cloneable接口的clone方法实现(对象必须要实现cloneable接口).2cloneSerialize.java是用对象流写对象到byte数组中,然后从byte数组中取得对象.(对象必须要实现serializble接口)

    对象克隆(clone)详解.docx

    查看了很多文章对于clone()方法讲解都不慎透彻,特别是对于深层克隆的讲解语言晦涩难懂,很难理解,包括Oracle公司出版的JDK帮助文档也讲的不清楚,本人通过具体实践通过浅显易懂的语言详细讲解了clone()方法。...

    详解Java中的clone方法?原型模式

     clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...

    Java中的clone方法详解_动力节点Java学院整理

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。下面通过本文给大家介绍java中的clone方法,感兴趣的朋友一起看看吧

    Java中的数组复制(clone与arraycopy)代码详解

    主要介绍了Java中的数组复制(clone与arraycopy)代码详解,本文并未全部介绍数组复制的几种方式,仅对clone和copy的相关内容进行了解析,具有一定参考价值,需要的朋友可以了解下。

    如何通过JVM角度谈谈Java的clone操作

    java中仅有的创建对象的两种方式:①.使用new操作符创建对象...使用clone方法复制对象。下面这篇文章主要通过JVM角度给大家详细谈谈Java的clone操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    Java利用序列化实现对象深度clone的方法

    主要介绍了Java利用序列化实现对象深度clone的方法,实例分析了java序列化及对象克隆的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    J2SE笔记讲解个人修订(1.1).docx

    1 JAVA认识 2 JAVA数据类型 3 面向对象程序设计 4 JAVA集合 5 JAVA反射机制 6 JAVA注解(ANNOTATION) 7 JAVA中的异常类 ...20 JAVA克隆CLONE(复制) 21 JAVA 网络编程 22 JAVA 其他未归类 23 JNI概述

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java clone()方法来由及用法

    并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子: ...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    在Java中优雅而简洁的创建对象的方法总结

    一般在Java里创建一个对象,有常用的几种方式 ...克隆调用现有对象的 clone()方法 反序列化调用 java.io.ObjectInputStream 的 getObject()方法反序列化 各自适合的场景,面对参数的变化,本资源提供了最优解决方案

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    java编程常见问题

    当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。 47.java.lang.EnumConstantNotPresentException 枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象...

Global site tag (gtag.js) - Google Analytics