Java 浅复制和深复制

概念

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

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

例子

 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 }

要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。

参考资料

原文地址:https://www.cnblogs.com/yuxiaoqi/p/4789442.html