首先我们创建对象Person、Car
package cn.qblank.test;
import java.io.Serializable;
public class Person implements Serializable{
private static final long serialVersionUID = -6833164004862850059L;
private String name; // 姓名
private int age; // 年龄
private Car car; // 座驾
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 Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}
public Person(String name, int age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
public Person() {
}
}
Car类
package cn.qblank.test;
import java.io.Serializable;
public class Car implements Serializable{
private static final long serialVersionUID = 1L;
private String brand; // 品牌
private int maxSpeed; // 最高时速
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public Car(String brand, int maxSpeed) {
this.brand = brand;
this.maxSpeed = maxSpeed;
}
public Car() {
}
@Override
public String toString() {
return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
}
}
复制对象
package cn.qblank.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 对象深度克隆:通过反序列化实现
* @author Administrator
*
*/
public class MyUtil {
private MyUtil() {
throw new AssertionError();
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();
// 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
}
}
测试:
package cn.qblank.test;
/**
* 测试
* @author evan_qb
*/
public class Demo4 {
public static void main(String[] args) {
try {
Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
Person p2 = MyUtil.clone(p1); // 深度克隆
p2.getCar().setBrand("BYD");
// 修改克隆的Person对象p2关联的汽车对象的品牌属性
// 原来的Person对象p1关联的汽车不会受到任何影响
// 因为在克隆Person对象时其关联的汽车对象也被克隆了
System.out.println("对象p1:"+p1);
System.out.println("对象p2:" + p2);
System.out.println("是否是一个对象?" + (p1 == p2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样,深层克隆就成功了