java中的對象復制有兩種方法,可以簡略的稱為淺克隆和深克隆
淺克隆:調用object的clone接口實現克隆,之所以稱為淺克隆,是因為在復制的過程中將對象的成員變量中的基本數據類型直接復制,但是對於引用數據類型只是將復制對象成員變量的引用傳遞過去,並沒有對於新對象生成新的成員變量,需要注意的地方,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; } }