深拷贝与浅拷贝的区别

浅拷贝

对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。“里面的对象”会在原来的对象和副本对象之间共享。例如,我们有一个Person对象。

public class Person{
	private Name name;
	private Address address;
}

我们对Person对象进行拷贝,而两个对象会共享Name和Address对象。拷贝构造器originalPerson 对象,然后对其应用变量进行复制。

public class Person {
    private Name name;
    private Address address;

    public Person(Person originalPerson) {
         this.name = originalPerson.name;
         this.address = originalPerson.address;
    }
}

浅拷贝的问题就是两个对象并非独立的,其中一方改变了变量另一方也会改变。

Person mother = new Person(new Name(…), new Address(…));

Person son  = new Person(mother);

son.moveOut(new Street(…), new City(…));

深拷贝

不同于浅拷贝,深拷贝是一个整个独立的对象拷贝。如果我们对整个 Person对象进行深拷贝,我们会对整个对象的结构都进行拷贝。
深拷贝在使用拷贝构造器进行拷贝时,里面的对象也会调用自身的拷贝构造器。

public class Person {
    private Name name;
    private Address address;

    public Person(Person otherPerson) {
         this.name    =  new Name(otherPerson.name);
         this.address =  new Address(otherPerson.address);
    }
}

要创建一个真正的深拷贝,就需要我们一直这样拷贝下去,一直覆盖到 Person 对象所有的内部元素, 最后只剩下原始的类型以及“不可变对象(Immutables)”。让我们观察下如下这个 Street 类以获得更好的理解:

public class Street {
    private String name;
    private int number;

    public Street(Street otherStreet){
         this.name = otherStreet.name;
         this.number = otherStreet.number;
    }
}

详细参考:https://www.oschina.net/translate/java-copy-shallow-vs-deep-in-which-you-will-swim#comments

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值