实现Serializable接口,
通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
代码如下:
1 package clone.serializable; 2 3 import java.io.*; 4 5 public class MyUtil { 6 private MyUtil() { 7 throw new AssertionError(); 8 } 9 10 @SuppressWarnings("unchecked") 11 public static <T extends Serializable> T clone(T obj) throws Exception { 12 ByteArrayOutputStream bout = new ByteArrayOutputStream(); 13 ObjectOutputStream oos = new ObjectOutputStream(bout); 14 oos.writeObject(obj); 15 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); 16 ObjectInputStream ois = new ObjectInputStream(bin); 17 return (T) ois.readObject(); 18 // 说明:调用 ByteArrayInputStream 或 ByteArrayOutputStream 对象的 close 方法没有任何意义 19 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这 一点不同于对外部资源(如文件流)的释放 20 } 21 } 22 23 package clone.serializable; 24 25 import java.io.Serializable; 26 27 public class Car implements Serializable { 28 29 private static final long serialVersionUID = -5713945027627603702L; 30 // 品牌 31 private String brand; 32 // 最高时速 33 private int maxSpeed; 34 public Car(String brand, int maxSpeed) { 35 this.brand = brand; 36 this.maxSpeed = maxSpeed; 37 } 38 public String getBrand() { 39 return brand; 40 } 41 public void setBrand(String brand) { 42 this.brand = brand; 43 } 44 public int getMaxSpeed() { 45 return maxSpeed; 46 } 47 public void setMaxSpeed(int maxSpeed) { 48 this.maxSpeed = maxSpeed; 49 } 50 @Override public String toString() { 51 return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]"; 52 } 53 } 54 55 56 package clone.serializable; 57 58 import java.io.Serializable; 59 60 public class Person implements Serializable { 61 private static final long serialVersionUID = -9102017020286042305L; 62 // 姓名 63 private String name; 64 // 年龄 65 private int age; 66 // 座驾 67 private Car car; 68 69 public Person(String name, int age, Car car) { 70 this.name = name; this.age = age; this.car = car; 71 } 72 public String getName() { 73 return name; 74 } 75 public void setName(String name) { 76 this.name = name; 77 } 78 public int getAge() { 79 return age; 80 } 81 public void setAge(int age) { 82 this.age = age; 83 } 84 public Car getCar() { 85 return car; 86 } 87 public void setCar(Car car) { 88 this.car = car; 89 } 90 @Override public String toString() { 91 return "Person [name=" + name + ", age=" + age + ", car=" + car + "]"; 92 } 93 } 94 95 96 package clone.serializable; 97 98 public class CloneTest { 99 public static void main(String[] args) { 100 try { 101 Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300)); 102 Person p2 = MyUtil.clone(p1); 103 // 深度克隆 104 p2.getCar().setBrand("BYD"); 105 // 修改克隆的 Person 对象 p2 关联的汽车对象的品牌属性 106 // 原来的 Person 对象 p1 关联的汽车不会受到任何影响 107 // 因为在克隆 Person 对象时其关联的汽车对象也被克隆了 108 System.out.println(p1); 109 System.out.println(p2); 110 }catch (Exception e) { 111 e.printStackTrace(); 112 } 113 } 114 }
原文:https://www.cnblogs.com/liangbaolong/p/14594348.html