`
lihengzkj
  • 浏览: 45049 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深度克隆和浅度克隆的总结

阅读更多
克隆的主对象:(重写了clone方法)
public class TestClonBean implements Cloneable,Serializable{
	private String name;
	private int age;
	private String sex;
	@Override
	protected TestClonBean clone(){
		TestClonBean bean = null;
		try {
			bean = (TestClonBean) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bean;
	}
	省略get/set方法……
}

克隆的从属对象:
public class TestCloneChildBean implements Cloneable,Serializable{
	private String cname;
	private String csex;
	private int cage;
	省略get/set方法……
}

深度克隆的工具类:
(深度克隆的原理:把对象序列化输出到内存,然后从内存中把序列化的byte[]取出来,进行反序列化获取对象)
public class DeepCloneBean {
	public static Object getObject(Object obj){
		Object cloneobj = null;
		ByteArrayInputStream bin = null;
		ByteArrayOutputStream bout = null;
		try {
			//把对象对到内存中去
			bout = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(bout);
			oos.writeObject(obj);
			oos.close();
			//把对象从内存中读出来          
			ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			cloneobj = ois.readObject();
			ois.close();
			return cloneobj;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

测试:
public class TestClone {
	public static void main(String []args){
		//浅度克隆
		TestCloneChildBean tcc = new TestCloneChildBean();
		TestCloneChildBean tcc1 = tcc.clone();
		System.out.println(tcc==tcc1);//result:false;
		TestClonBean tcb = new TestClonBean();
		tcb.setChild(tcc);
		TestClonBean tcb1 = tcb.clone();
		System.out.println(tcb==tcb1);//result:false;
		System.out.println(tcb.getChild()==tcb1.getChild());//result:true;
		System.out.println("*****************浅度克隆完************");
		//深度克隆
		TestClonBean tt1 = new TestClonBean();
		TestCloneChildBean tc1 = new TestCloneChildBean();
		tt1.setChild(tc1);
		TestClonBean tcbclone = (TestClonBean) DeepCloneBean.getObject(tt1);
		System.out.println(tt1==tcbclone);//result:false;
		System.out.println(tt1.getChild()==tcbclone.getChild());//result:false;
	}
}

总结:
不管是深度克隆还是浅度的克隆其实都是产生了一个新的对象。所以我们在比较克隆对象和源对象的时候返回是false。而深度克隆和浅度的克隆的区别在于:浅度克隆的对象只会克隆普通属性,不会克隆对象属性。而深度克隆就会连对象属性一起克隆。所以我们在对比深度克隆中的tt1.getChild()==tcbclone.getChild()时,返回是false。而浅度克隆时返回true。
分享到:
评论
1 楼 yimengyuanyun 2013-02-01  
浅度克隆后,里面的对象是不是还是指向原来的对象,所以tcb.getChild()==tcb1.getChild()为true,这样理解对伐?

相关推荐

    解析JAVA深度克隆与浅度克隆的区别详解

    Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...

    C#中深度复制和浅度复制详解

    总结来说,理解C#中的深度复制和浅度复制是优化代码和避免意外副作用的关键。在处理复杂对象时,选择正确的复制策略能够确保程序的行为符合预期。在实际开发中,根据需求选择适当的复制方式,能够提高代码的稳定性...

    c#深度复制浅度复制

    在C#编程中,"深度复制"和"浅度复制"是对象复制过程中两个重要的概念,它们涉及到如何正确地复制复杂的数据结构。了解并熟练掌握这两种复制方式对于编写高效、可靠的代码至关重要。 首先,让我们来定义这两个术语:...

    ASP.NET深度复制和浅度复制分析

    ***中深度复制和浅度复制是编程中常见的概念,尤其是在涉及到对象复制和内存管理的场景中。为了理解这两个概念,首先我们需要明确值类型和引用类型的区别。 值类型直接存储其数据,而在.NET框架中包括了所有的基本...

    javascript克隆对象深度介绍

    在进行对象克隆的过程中,根据复制的深度,可以分为浅度克隆和深度克隆。 浅度克隆(Shallow Clone)仅适用于对象的第一层属性,如果属性值为基本类型,则复制其值;如果属性值为引用类型,则复制其引用地址。这...

    prototypeAndCreate.zip

    在“prototypeAndCreate.zip”压缩包中,我们可能找到与原型模式相关的代码示例,包括浅度克隆和深度克隆两种不同的复制策略。浅度克隆仅仅复制对象本身,而不复制其引用的对象,而深度克隆则会递归地复制对象及其...

    基于java实现浅度爬虫应用

    浅度爬虫是相对于深度爬虫而言的,它主要集中在网站表面的页面,通常用于获取网页的元数据或者对特定领域的信息进行快速索引。本项目基于Java编程语言,为初学者提供了一个简单的入门实践,旨在帮助理解如何构建一个...

    浅度解析C++运算符重载

    本文将浅度解析C++中的运算符重载,以帮助初学者更好地理解和应用这一机制。 1. 概述 运算符重载是C++中的一种多态形式,它使得我们可以为不同的数据类型定义相同运算符的不同行为。通过重载,我们可以让自定义...

    网络语言浅度研究报告.doc

    网络语言浅度研究报告.doc

    MyEclipse浅度优化方法

    ### MyEclipse浅度优化方法 #### 一、引言 在软件开发过程中,开发工具的性能直接影响到工作效率。MyEclipse作为一款流行的Java集成开发环境(IDE),因其丰富的功能和良好的用户界面受到广泛欢迎。然而,对于一些...

    实例详解vue.js浅度监听和深度监听及watch用法

    在了解了浅度监听和深度监听的基本概念和用法后,我们可以总结出一些使用它们时的技巧。对于浅度监听,当你只关注数据属性的最外层变化时,可以使用它;而对于对象和数组这样的复杂数据结构,由于它们是通过引用来...

    Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍

    在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...

    浅度探索C++对象模型bin3.ppt

    浅度探索C++对象模型bin3.ppt

    初中数学深度学习:从理解到实践.pdf

    4. 教学实践的重要性:通过分析和总结已有的教学实践,教师可以更好地理解深度学习,并在实际教学中更好地引导学生实现深度学习。 5. 创新与批判性思维:深度学习鼓励创新性思维和批判性学习,使学生不仅能记住知识...

    java-6个机制.doc

    **1.4 深度克隆与浅度克隆** - **浅度克隆**:仅复制对象的基本类型属性值,对于对象引用类型属性,只复制引用本身而非引用指向的对象。 - **深度克隆**:不仅复制对象本身,还递归复制对象内的所有引用对象。 **...

Global site tag (gtag.js) - Google Analytics