克隆的主对象:(重写了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。
分享到:
相关推荐
本篇文章是对JAVA深度克隆与浅度克隆的区别进行了详细的分析介绍,需要的朋友参考下
本文章主要是讲解C# 语言编程中,深度复制和浅度复制,下面我将通过一个实例进行讲解。在实例开发之前,我们得先知道深度复制是什么和浅度复制是什么,它们之间的区别又是什么,下面将为大家一一揭晓。 1.深度复制是...
c#深度复制浅度复制
本文深入浅出的分析了ASP.NET深度复制和浅度复制。分享给大家供大家参考。具体分析如下: 之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉。 如果大家不懂值...
克隆或者拷贝分为2种: 浅度克隆:基本类型为值传递,对象仍为引用传递。 深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改。 代码如下: function ...
原型实例代码示例 浅度克隆、深度克隆 创建模式代码示例 组装车辆
网络语言浅度研究报告.doc
基于java实现浅度爬虫应用,是我学习java来练练手的,java爬虫基础入门的学生可以考虑参考一下
主要介绍了Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍,需要的朋友可以参考下
浅度探索C++对象模型bin3.ppt
主要介绍了vue.js浅度监听和深度监听及watch用法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
NULL 博文链接:https://lzy.iteye.com/blog/407956
大家是否觉得MyEclipse启动很慢,那么来看一下吧,如果谁有其他的优化方法,欢迎交流!
踏入C++的世界已经两年了,但一直在黑夜中前行,最近看到了由Lostmouse 译的Scott Meyers的著作《EffectiveC++》的中文版电子书,犹如一盏指路明灯,照亮了我前进的路。这本书由lians制作,由save 修订。...
主要介绍了C#浅拷贝和深拷贝,是比较重要的概念,需要的朋友可以参考下
介绍了人工智能技术的相关概念、发展概述及其在煤炭行业发展中的应用,指出目前人工智能技术在矿山应用只是点状结合和浅度结合,没有实现人工智能技术和矿山某个生产或管理系统层面的深度融合。概述了智能矿山的发展...
同时依据基于耗氧量建立的数学模型来测算煤低温氧化时不同粒径煤样活化能和指前因子等动力学参数,结果表明不同粒径煤样低温氧化耗氧速率变化分为缓慢耗氧、浅度耗氧和深度耗氧等三个阶段,在实验条件下煤样粒径小于0....