首先什么是深度复制?什么又是浅复制?
百度告诉我--------------->
浅复制:将一个对象复制后,基本类型都会重新创建,而引用类型指向的还是原对象所指的引用;
深复制:讲一个对象复制后,不论是基本类型还是引用类型都是重新创建的。
下面看我们的深度复制方法
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();}}
}
测试结果