引用拷贝、浅拷贝 和 深拷贝

引用拷贝

二者的引用是同一个对象,并没有创建出一个新的对象

因为是同一个对象的引用,所以两者改一个,另一个对象的值也随之改变

 

浅拷贝

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝

如果属性是基本类型,拷贝的就是基本类型的值;

如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

   @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;
    }
}

 

posted @ 2019-08-06 19:23  伽利略  阅读(1824)  评论(0编辑  收藏  举报