首先,我们先来bala一下深复制和浅复制。
浅复制:被复制对象的所有变量(Java八大基本类型和String)都含有与原来的对象相同的值,而所有的对其他对象(除了String)的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
好了,下面进入正题。
首先,我们建立一个老师类。
import java.io.Serializable;
public class Teacher implements Serializable{
private static final long serialVersionUID = -6635991328204468281L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
'}';
}
}然后,建立一个学生类,与老师具有组合的关系。
import java.io.*;
public class Student implements Serializable {
private static final long serialVersionUID = 5630895052908986144L;
private String name;
private int age;
private Teacher teacher;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
//序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(this);
//反序列化
bais = new ByteArrayInputStream(baos.toByteArray());
ois = new ObjectInputStream(bais);
return ois.readObject();
} finally {
baos.close();
;
oos.close();
bais.close();
ois.close();
}
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", teacher=" + teacher +
'}';
}
}然后是我们的测试代码:
import java.io.IOException;
public class CloneDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Teacher teacher=new Teacher();
teacher.setName("teacher");
Student student=new Student();
student.setName("student");
student.setAge(35);
student.setTeacher(teacher);
Student student2=(Student) student.deepClone(); //克隆一个对象
System.out.println(student.getTeacher()==student2.getTeacher());
}
}程序的运行结果是false,这说明两个学生的老师并不是一个对象,实现了深复制。
本文通过实例演示了Java中深复制与浅复制的区别,并详细解释了如何实现深复制。通过创建教师和学生类,展示了使用序列化和反序列化方法进行深复制的过程。

195

被折叠的 条评论
为什么被折叠?



