java学习之路――对象的浅复制和深复制(二)

2014-11-24 02:57:45 · 作者: · 浏览: 1
return obj;

}

}

\

上图为浅复制。

\

上图为深复制。

第二种:实现深复制的方法是通过串行化和反串行化

利用对象串行化的特性:一个对象如果进行串行化则会将它所引用的对象都进行串行化。所以它的这个特性正好符合深度复制的要求。

例如以下示例:

package com.lcq.clone;

/**

*

* 类名:CloneTest2

* 功能:利用对象的序列化和反序列化实现对象的深复制

* 时间:

*

* @version 1.0

* @author lcq

*

*/

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class CloneTest2 {

public static void main(String[] args) throws Exception {

Teacher2 teacher2 = new Teacher2();

teacher2.setAge(40);

teacher2.setName("teacher zhang");

Student2 stu2 = new Student2();

stu2.setAge(20);

stu2.setName("student zhangsan");

stu2.setTeacher2(teacher2);

System.out.println("------------最初的学生对象信息-----------------");

System.out.println(stu2.getAge());

System.out.println(stu2.getName());

System.out.println(stu2.getTeacher2().getAge());

System.out.println(stu2.getTeacher2().getName());

System.out.println("------------复制的学生对象信息-----------------");

Student2 stu3 = (Student2)stu2.deepClone();

System.out.println(stu3.getAge());

System.out.println(stu3.getName());

System.out.println(stu3.getTeacher2().getAge());

System.out.println(stu3.getTeacher2().getName());

System.out.println("------------修改复制对象后原学生对象信息-----------------");

stu3.getTeacher2().setAge(30);

stu3.getTeacher2().setName("teacher change");

System.out.println(stu2.getTeacher2().getAge());

System.out.println(stu2.getTeacher2().getName());

}

}

class Teacher2 implements Serializable{

/**

*

*/

private static final long serialVersionUID = 502125658040435679L;

private int age;

private String name;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

class Student2 implements Serializable{

/**

*

*/

private static final long serialVersionUID = -3893457198772401952L;

private int age;

private String name;

private Teacher2 teacher2;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Teacher2 getTeacher2() {

return teacher2;

}

public void setTeacher2(Teacher2 teacher2) {

this.teacher2 = teacher2;

}

//定义深复制方法

public Object deepClone() throws Exception{

//将当前对象序列化

ByteArrayOutputStream bao = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bao);

oos.writeObject(this);