深复制和浅复制的区别和使用

区别

浅复制

被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深复制

被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。换言之,深复制把复制的对象所引用的对象都复制了一遍。

定义如下一个类:

class Test {
    public int i;
    public StringBuffer s;
}

如图所示,给出了对这个类的对象进行复制时,浅复制与深复制的区别。

在这里插入图片描述

使用

下面是一段深复制的代码,当我们在使用时,检查类中是否含有引用类型成员变量,如果没有则直接返回super.clone()即可;若有确保类中包含的所有非基本类型的成员变量都实现了深复制。

import java.util.Date;

public class DeepCopy implements Cloneable{
    private Date birth = new Date();

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Date getBirth() {
        return birth;
    }

    public void changeDate(){
        this.birth.setMonth(4);
    }

    public Object clone(){
        DeepCopy o =null;
        try{
            o = (DeepCopy)super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        //实现深复制,成员变量如果是引用类型依然是使用clone方法
        o.birth = (Date)this.getBirth().clone();
        return o;
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值