概念
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
例子
1 import java.io.ByteArrayInputStream; 2 import java.io.ByteArrayOutputStream; 3 import java.io.IOException; 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6 import java.io.Serializable; 7 8 public class Prototype { 9 private static final long serialVersionUID = 1L; 10 private String string; 11 12 private SerializableObject obj; 13 14 /* 浅复制 */ 15 public Object clone() throws CloneNotSupportedException { 16 Prototype proto = (Prototype) super.clone(); 17 return proto; 18 } 19 20 /* 深复制 */ 21 public Object deepClone() throws IOException, ClassNotFoundException { 22 23 /* 写入当前对象的二进制流 */ 24 ByteArrayOutputStream bos = new ByteArrayOutputStream(); 25 ObjectOutputStream oos = new ObjectOutputStream(bos); 26 oos.writeObject(this); 27 28 /* 读出二进制流产生的新对象 */ 29 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); 30 ObjectInputStream ois = new ObjectInputStream(bis); 31 return ois.readObject(); 32 } 33 34 public String getString() { 35 return string; 36 } 37 38 public void setString(String string) { 39 this.string = string; 40 } 41 42 public SerializableObject getObj() { 43 return obj; 44 } 45 46 public void setObj(SerializableObject obj) { 47 this.obj = obj; 48 } 49 } 50 51 52 class SerializableObject implements Serializable { 53 private static final long serialVersionUID = 1L; 54 }
要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。