对象的深度复制

来源:互联网 发布:mac给iphone换铃声 编辑:程序博客网 时间:2024/05/05 16:01

首先什么是深度复制?什么又是浅复制?

百度告诉我--------------->

浅复制:将一个对象复制后,基本类型都会重新创建,而引用类型指向的还是原对象所指的引用;

深复制:讲一个对象复制后,不论是基本类型还是引用类型都是重新创建的。


下面看我们的深度复制方法

package everyworkdayprogramming._2015_3_03;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Date;/** *  * 在使用对象流对对象进行深度复制的时候对象必须实现Cloneable,Serializable接口 * 前者标明对象是可以被复制的,后者则是为了能够满足我们使用对象流对对象进行深度复制 *  * */public class CopySource implements Cloneable, Serializable {/** * @Fields serialVersionUID : 对象的序列化唯一标识 */private static final long serialVersionUID = -3446490540857082055L;/* 定义连个变量,不是基本类型,而且都实现了Serializable 接口 */private String string;private SerializableObject serializableObject;public String getString() {return string;}public void setString(String string) {this.string = string;}public SerializableObject getSerializableObject() {return serializableObject;}public void setSerializableObject(SerializableObject serializableObject) {this.serializableObject = serializableObject;}/* 浅复制 */public Object clone() throws CloneNotSupportedException {/* 浅复制直接调用父类的clone方法就可以进行复制 */CopySource copySource = (CopySource) super.clone();return copySource;}/* 深复制 */public Object deepClone() throws IOException, ClassNotFoundException {/* 写入当前对象的二进制流 */ByteArrayOutputStream out = new ByteArrayOutputStream();ObjectOutputStream oout = new ObjectOutputStream(out);oout.writeObject(this);/* 读出二进制流产生的新对象 */ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));/* 这样我们的深度复制工作就完成了;所有对象都是新的 */return oin.readObject();}}/** *  * 该类包含在CopySource中,用于测试是否对类的实例中的该对象进行了深度复制 *  * */class SerializableObject implements Serializable {/** * @Fields serialVersionUID : 对象的序列化唯一标识 */private static final long serialVersionUID = 6357352492173107445L;/* 一下的属性用于测试对象中的对象中的对象是否还可以被深度复制 *//* 基本类型 */private int x = 1;/* 非基本类型 */private Date date;private SerializableObject1 serializableObject1;public int getX() {return x;}public void setX(int x) {this.x = x;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public SerializableObject1 getSerializableObject1() {return serializableObject1;}public void setSerializableObject1(SerializableObject1 serializableObject1) {this.serializableObject1 = serializableObject1;}}/** *  * 对象中的对象中的对象,当然也实现了Serializable *  * */class SerializableObject1 implements Serializable {/** * @Fields serialVersionUID : 对象的序列化唯一标识 */private static final long serialVersionUID = 1L;}


测试方法:


package everyworkdayprogramming._2015_3_03;import java.io.IOException;import java.util.Date;public class Test {public static void main(String[] args) {/* 创建要被复制的对象,并初始化相应属性 */CopySource copy = new CopySource();copy.setSerializableObject(new SerializableObject());copy.setString("123");copy.getSerializableObject().setX(2);copy.getSerializableObject().setDate(new Date());copy.getSerializableObject().setSerializableObject1(new SerializableObject1());try {/* 浅复制copy 到 copy1 */CopySource copy1 = (CopySource) copy.clone();/* 深复制copy 到 copy2 */CopySource copy2 = (CopySource) copy.deepClone();/* 判断SerialiableObject在浅复制和深复制后是否与原对象中的相等 */System.out.println("----------------------------------------------------------判断SerialiableObject在浅复制和深复制后是否与原对象中的相等");System.out.println(copy.getSerializableObject() == copy1.getSerializableObject());System.out.println(copy.getSerializableObject() == copy2.getSerializableObject());/* 判断string在浅复制和深复制后是否与原对象的相等 */System.out.println("----------------------------------------------------------判断string在浅复制和深复制后是否与原对象的相等");System.out.println(copy.getString() == copy1.getString());System.out.println(copy.getString() == copy2.getString());/* 判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 */System.out.println("----------------------------------------------------------判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 ");System.out.println(copy.getSerializableObject().getDate() == copy1.getSerializableObject().getDate());System.out.println(copy.getSerializableObject().getDate() == copy2.getSerializableObject().getDate());/* 判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等 */System.out.println("----------------------------------------------------------判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等");System.out.println(copy.getSerializableObject().getSerializableObject1() == copy1.getSerializableObject().getSerializableObject1());System.out.println(copy.getSerializableObject().getSerializableObject1() == copy2.getSerializableObject().getSerializableObject1());} catch (CloneNotSupportedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}

测试结果



0 0
原创粉丝点击