java深淺復制
一、概念
二、實現方式及簡單原理
三、實例
四、參考
五、單元測試
六、代碼下載 (deepCopy.rar)
一、概念
A、淺復制:淺復制僅僅復制所考慮的對象,而不復制它所引用的對象
被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。
B、深復制:深復制把要復制的對象所引用的對象都復制了一遍
被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。
1、淺復制:實現Cloneable接口,重寫clone()方法()
2、深復制:實現serializable接口,字節流轉化為對象流來處理
A、淺復制
public class Student implements Cloneable { public String studentName; public int studentAge; public Student(String studentName, int studentAge) { this.studentName = studentName; this.studentAge = studentAge; } @Override public Student clone() throws CloneNotSupportedException { return (Student)super.clone(); } } |
B1、深復制(Cloneable) B2、深復制(Serializable)
public class Teacher implements Cloneable,Serializable { String teacherName; int teacherAge; public Teacher(String teacherName, int teacherAge) { this.teacherName = teacherName; this.teacherAge = teacherAge; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Man implements Cloneable,Serializable { String name; int age; public Teacher teacher; public Man(String name, int age, Teacher teacher) { this.name = name; this.age = age; this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { Man man = null; man = (Man)super.clone(); man.teacher = (Teacher) teacher.clone(); //important return man; } /** * serialized copy * @return Man * @throws IOException * @throws ClassNotFoundException */ public Object serialClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } } |
(經典)http://blog.csdn.net/guitacom/article/details/665055#
http://dev.firnow.com/course/3_program/java/javashl/2008510/115047.html
public class StudentTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void testShallowClone() throws Exception { String name = "Robert C. Martin"; int age = 40; Student student = new Student(name, age); Student studentCopy = (Student) student.clone(); studentCopy.studentName = "Kent Benk"; studentCopy.studentAge = 55; assertEquals(student.studentName, "Robert C. Martin"); assertEquals(student.studentAge, 40); } @Test public void testDeepClone() throws CloneNotSupportedException { String manName = "Robert C. Martin"; int manAge = 40; String teacherName = "T1"; int teacherAge = 50; Teacher teacher = new Teacher(teacherName, teacherAge); Man man = new Man(manName, manAge, teacher); Man replication = (Man)man.clone(); replication.teacher.teacherName = "T2"; replication.teacher.teacherAge = 60; assertEquals(man.teacher.teacherName, "T1"); //original teacher's properties don't change assertEquals(man.teacher.teacherAge, 50); } @Test public void testSerialDeepClone() throws IOException, ClassNotFoundException { String manName = "Robert C. Martin"; int manAge = 40; int teacherAge = 50; String teacherName = "T1"; Teacher teacher = new Teacher(teacherName, teacherAge); Man man = new Man(manName, manAge, teacher); Man replication = (Man) man.serialClone(); replication.teacher.teacherName = "T2"; replication.teacher.teacherAge = 60; assertEquals(man.teacher.teacherName, "T1"); //original teacher's properties don't change assertEquals(man.teacher.teacherAge, 50); } |
posted on 2012-04-13 14:47 zhb8015 閱讀(667) 評論(1) 編輯 收藏 所屬分類: interview