java中關於對象的複製

來源:互聯網
上載者:User

標籤:

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中關於對象的複製

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.