?
?
?????? 浅克隆
?
/** * 浅克隆 * @author InJavaWeTrust * */ class Father implements Cloneable { public String name; public int age; public Father(String name, int age) { this.name = name; this.age = age; } } public class Child implements Cloneable { public String name; public int age; public Father father; public Child(String name, int age, Father father) { this.name = name; this.age = age; this.father = father; } public Object clone() { Child child = null; try { child = (Child) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return child; } public static void main(String[] args) { Father father = new Father("李刚", 44); Child child1 = new Child("李启铭", 14, father); Child child2 = (Child) child1.clone(); child2.father.name = "赵刚"; child2.father.age = 40; child2.name = "赵启铭"; child2.age = 15; System.out.println(child1.name + " " + child1.age); System.out.println(child1.father.name + " " + child1.father.age); System.out.println(child2.name + " " + child2.age); System.out.println(child2.father.name + " " + child2.father.age); } // 运行结果 // 李启铭 14 // 赵刚 40 // 赵启铭 15 // 赵刚 40 // 浅克隆时father对象都是共用的,所以father重新赋值之后,之前的值也跟着变化。 }
?
?????? 深克隆
/** * 深克隆 * @author InJavaWeTrust * */ class Father implements Cloneable { public String name; public int age; public Father(String name, int age) { this.name = name; this.age = age; } public Object clone() { Father father = null; try { father = (Father) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return father; } } public class Child implements Cloneable { private String name; private int age; private Father father; public Child(String name, int age, Father father) { this.name = name; this.age = age; this.father = father; } public Object clone() { Child child = null; try { child = (Child) super.clone(); child.father = (Father) father.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return child; } public static void main(String[] args) { Father father = new Father("李刚", 44); Child child1 = new Child("李启铭", 14, father); Child child2 = (Child) child1.clone(); child2.father.name = "赵刚"; child2.father.age = 40; child2.name = "赵启铭"; child2.age = 15; System.out.println(child1.name + " " + child1.age); System.out.println(child1.father.name + " " + child1.father.age); System.out.println(child2.name + " " + child2.age); System.out.println(child2.father.name + " " + child2.father.age); } // 运行结果 // 李启铭 14 // 李刚 44 // 赵启铭 15 // 赵刚 40 // 深克隆时father对象也 重新拷贝了一份,所以father重新赋值之后,之前的值不会发生变化。 }
?
????? 利用序列化也可以实现深克隆。
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; /** * 序列化深克隆 * @author InJavaWeTrust * */ class Father implements Serializable { private static final long serialVersionUID = 5339188002945518918L; public String name; public int age; public Father(String name, int age) { this.name = name; this.age = age; } } public class Child implements Serializable{ private static final long serialVersionUID = 991407861345394819L; private String name; private int age; private Father father; public Child(String name, int age, Father father) { this.name = name; this.age = age; this.father = father; } public Object deepClone() { Object object = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); object = ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return object; } public static void main(String[] args) { Father father = new Father("李刚", 44); Child child1 = new Child("李启铭", 14, father); Child child2 = (Child) child1.deepClone(); child2.father.name = "赵刚"; child2.father.age = 40; child2.name = "赵启铭"; child2.age = 15; System.out.println(child1.name + " " + child1.age); System.out.println(child1.father.name + " " + child1.father.age); System.out.println(child2.name + " " + child2.age); System.out.println(child2.father.name + " " + child2.father.age); } // 运行结果 // 李启铭 14 // 李刚 44 // 赵启铭 15 // 赵刚 40 }
?
原文:http://injavawetrust.iteye.com/blog/2310086