1、介绍
为了避免重写比较复杂对象的clone()方法, 来实现深度克隆的目的。可以使用串行化的方式将对象读到流中然后再读出。
把对象写到流里的过程是串行化(Serilization)过程,应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从流里读出来便可以重建对象。
这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的。
2、例子
package deep;
import java.io.Serializable;
public class Teacher implements Serializable {
String name;
int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
}
package deep;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.Serializable;
public class Student implements Serializable {
String name;// 常量对象
int age;
Teacher t;// 学生1和学生2的引用值都是一样的。
public Student(String name, int age, Teacher t) {
this.name = name;
this.age = age;
this.t = t;
}
public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException {
// 将对象写到流里
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
// 从流里读出来
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
package deep;
import java.io.IOException;
import java.io.OptionalDataException;
public class MyMainTest {
public static void main(String[] args) throws OptionalDataException, ClassNotFoundException, IOException {
Teacher t = new Teacher("tangliang", 30);
Student s1 = new Student("zhangsan", 18, t);
Student s2 = (Student) s1.deepClone();
s2.t.name = "tony";
s2.t.age = 40;
// 学生1的老师不改变
System.out.println("name=" + s1.t.name + "," + "age=" + s1.t.age); // name=tangliang,age=30
}
}
从运行结果可以看出学生1和学生2的Teacher 对象已经不再是同一个对象,从而实现了深拷贝的目的。