importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;//利用序列化来做深复制//深clone
public classDeepCloneTest
{public static void main(String[] args) throwsException
{//teacher对象将不被clone出来的Student对象共享.
Teacher teacher = newTeacher();
teacher.setAge(40);
teacher.setName("Teacher zhang");
Student student1= newStudent();
student1.setAge(20);
student1.setName("zhangsan");
student1.setTeacher(teacher);//复制出来一个对象student2
Student student2 =(Student) student1.deepCopy();
System.out.println(student2.getAge());
System.out.println(student2.getName());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(student1.getTeacher().getAge());
System.out.println(student1.getTeacher().getName());//修改student2的引用对象
student2.getTeacher().setAge(50);
student2.getTeacher().setName("Teacher Li");
System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(student1.getTeacher().getAge());
System.out.println(student1.getTeacher().getName());
}
}class Teacher implementsSerializable
{private static final long serialVersionUID = -8834559347461591191L;public intage;publicString name;public intgetAge()
{returnage;
}public void setAge(intage)
{this.age =age;
}publicString getName()
{returnname;
}public voidsetName(String name)
{this.name =name;
}
}class Student implementsSerializable
{//serialVersionUID//如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。//但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值
private static final long serialVersionUID = 7991552226614088458L;public intage;publicString name;publicTeacher teacher;public intgetAge()
{returnage;
}public void setAge(intage)
{this.age =age;
}publicString getName()
{returnname;
}public voidsetName(String name)
{this.name =name;
}publicTeacher getTeacher()
{returnteacher;
}public voidsetTeacher(Teacher teacher)
{this.teacher =teacher;
}/*** 因为对象序列化会自然地对对象深拷贝,再利用“序列化-反序列化”读出*/
public Object deepCopy() throwsException
{//将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
ByteArrayOutputStream bos = newByteArrayOutputStream();
ObjectOutputStream oos= newObjectOutputStream(bos);//this很关键,引用当前对象,当然,这是值传递
oos.writeObject(this);//将流序列化成对象
ByteArrayInputStream bis = newByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois= newObjectInputStream(bis);returnois.readObject();
}
}
输出结果为:20zhangsan~~~~~~~~~~~~~~~~~~~~~~
40Teacher zhang~~~~~~~~~~~~~~~~~~~~~~
40Teacher zhang