Java基础-浅拷贝和深拷贝

浅拷贝

浅拷贝会在堆上创建一个新的对象,如果原对象的属性是一个引用类型,拷贝的内部对象是原对象内部对象的引用地址,即原对象和拷贝对象用的是同一个内部对象。

class Inner implements Cloneable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Inner(String name) {
        this.name = name;
    }

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

class Outer implements Cloneable{
    private Inner inner;

    public Inner getInner() {
        return inner;
    }

    public void setInner(Inner inner) {
        this.inner = inner;
    }

    public Outer(Inner inner) {
        this.inner = inner;
    }

    @Override
    protected Outer clone() throws CloneNotSupportedException {
        Outer outer = (Outer) super.clone();
        return outer;
    }
}

@Test
public void testCopy() throws CloneNotSupportedException {
    Outer outer = new Outer(new Inner("inner"));
    Outer clone = outer.clone();
    System.out.println(outer.getInner() == clone.getInner());
    // 输出:true
}

深拷贝

深拷贝会完全复制整个对象,包括原对象的内部对象。

class Inner implements Cloneable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Inner(String name) {
        this.name = name;
    }

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

class Outer implements Cloneable{
    private Inner inner;

    public Inner getInner() {
        return inner;
    }

    public void setInner(Inner inner) {
        this.inner = inner;
    }

    public Outer(Inner inner) {
        this.inner = inner;
    }

    @Override
    protected Outer clone() throws CloneNotSupportedException {
        Outer outer = (Outer) super.clone();
        outer.setInner(new Inner("inner")); // 拷贝一份内部对象
        return outer;
    }
}

@Test
public void testCopy() throws CloneNotSupportedException {
    Outer outer = new Outer(new Inner("inner"));
    Outer clone = outer.clone();
    System.out.println(outer.getInner() == clone.getInner());
    // 输出:false
}
posted @ 2023-02-02 14:42  啊发包  阅读(30)  评论(0)    收藏  举报