引用拷貝、淺拷貝 和 深拷貝


引用拷貝

二者的引用是同一個對象,並沒有創建出一個新的對象

因為是同一個對象的引用,所以兩者改一個,另一個對象的值也隨之改變

 

淺拷貝

淺拷貝是按位拷貝對象,它會創建一個新對象,這個對象有着原始對象屬性值的一份精確拷貝

如果屬性是基本類型,拷貝的就是基本類型的值;

如果屬性是引用類型,拷貝的就是內存地址(即復制引用但不復制引用的對象) ,因此如果其中一個對象改變了這個地址,就會影響到另一個對象。

   @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

 

深拷貝

被拷貝對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。

那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person newPerson = (Person)super.clone();
        newPerson.address = (Address) newPerson.address.clone();
        return newPerson;
    }

 

通過對象序列化實現深拷貝

將對象序列化為字節序列后,默認會將該對象的整個對象圖進行序列化,再通過反序列即可完美地實現深拷貝。

public class Person implements Serializable, Cloneable{
    public Object deepClone()  {
        try {
            ByteArrayOutputStream bo= new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(bo);
            os.writeObject(this);
            ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi=new ObjectInputStream(bi);
            return(oi.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM