標籤:
java中的對象複製有兩種方法,可以簡略的稱為淺複製和深複製
淺複製:調用object的clone介面實現複製,之所以稱為淺複製,是因為在複製的過程中將對象的成員變數中的基礎資料型別 (Elementary Data Type)直接複製,但是對於引用資料類型只是將複製對象成員變數的引用傳遞過去,並沒有對於新對象產生新的成員變數,需要注意的地方,object的clone()方法的存取修飾詞是protect的,所以,需要在對象中重寫clone方法,將其存取修飾詞修改為public方法即可
深複製:將當前對象以及對象的成員變數完整的複製,產生一個與之前對象完全相同又毫無關係的對象,需要複製的對象必須實現 Serializable介面,採用輸入輸出資料流的方式,擷取到當前對象的流檔案,複製該流檔案,再產生新的對象
以下是所寫的案例代碼:
package objDeepCopy;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class DeepCopy { public static void main(String[] args) throws Exception { Teacher teacher=new Teacher(); teacher.settAge(20); teacher.settName("zhangsan"); Student student1=new Student(); student1.setsAge(55); student1.setsName("xiaojiang"); student1.setsTeacher(teacher); System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName()); Student student2=lowCopy(student1); System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName()); //對student1修改,只對複製對象的成員變數進行複製,但是引用的變數只是將引用指向過去 student1.setsAge(44); student1.setsName("xinxiaoming"); student1.getsTeacher().settName("xinlaoshi"); System.out.println("------------------"); System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName()); System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName()); //深複製通過流,將對象完整的複製過去,並不是引用// System.out.println("------------------深複製");// // Teacher teacher=new Teacher();// teacher.settAge(20);// teacher.settName("zhangsan");// Student student1=new Student();// student1.setsAge(55);// student1.setsName("xiaojiang");// student1.setsTeacher(teacher);// System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());// Student student2=student1.deepCopy(student1);// System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName());// //對student1修改,只對複製對象的成員變數進行複製,但是引用的變數只是將引用指向過去// student1.setsAge(44);// student1.setsName("xinxiaoming");// student1.getsTeacher().settName("xinlaoshi");// System.out.println("------------------");// System.out.println("student1"+student1.getsAge()+student1.getsName()+student1.getsTeacher().gettAge()+student1.getsTeacher().gettName());// System.out.println("student2"+student2.getsAge()+student2.getsName()+student2.getsTeacher().gettAge()+student2.getsTeacher().gettName()); } public static Student lowCopy(Student student) throws Exception{ Student student2 = (Student) student.clone(); return student2; } }class Student implements Serializable,Cloneable{ /** * */ private static final long serialVersionUID = 5668069747602085306L; private int sAge; private String sName; private Teacher sTeacher; public int getsAge() { return sAge; } public void setsAge(int sAge) { this.sAge = sAge; } public String getsName() { return sName; } public void setsName(String sName) { this.sName = sName; } public Teacher getsTeacher() { return sTeacher; } public void setsTeacher(Teacher sTeacher) { this.sTeacher = sTeacher; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } public Student deepCopy(Student student) throws Exception{ ByteArrayOutputStream boStream=new ByteArrayOutputStream(); ObjectOutputStream oos= new ObjectOutputStream(boStream); oos.writeObject(this); ByteArrayInputStream bis=new ByteArrayInputStream(boStream.toByteArray()); ObjectInputStream ois=new ObjectInputStream(bis); return (Student) ois.readObject(); } }class Teacher implements Serializable{ private int tAge; private String tName; public int gettAge() { return tAge; } public void settAge(int tAge) { this.tAge = tAge; } public String gettName() { return tName; } public void settName(String tName) { this.tName = tName; } }
java中關於對象的複製