java对象的克隆

摘取至https://blog.csdn.net/ztchun/article/details/79110096

一.对象赋值

如果直接对象赋值,例如:stu2 = stu1那么情况将是:栈中两个对象名称指向同一块堆内存。更改任何一个对象中的值都会导致另一个的值改变,因为就是同一块内存空间。

二.浅克隆

被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。

即在覆写的clone()方法中直接调用super.clone()方法,再转型至对象的变量类型即可

@Override  
    public Object clone() {  
        Student stu = null;  
        try{  
            stu = (Student)super.clone();  
        }catch(CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return stu;  
    }  

此时的情况就是对象中的值类型成员变量被拷贝了一份,但是引用类型的变量只是把地址拷贝了一份,就是说引用类型的数据成员还是公用同一份内存地址的。

在这里插入图片描述

三.深克隆
在浅克隆的基础上将引用类型也拷贝一份,实现:
首先, 在引用类型的成员变量的本身的类定义中也覆写clone(),调用super.clone();
再在要拷贝的类覆写的clone()方法中调用引用类型变量的clone()方法。
例如:要拷贝Student类的对象,该类中有一个引用类型的变量:private Address addr;
则首先在Address类中覆写clone()方法:

class Address implements Cloneable {  
    private String add;  

    public String getAdd() {  
        return add;  
    }  

    public void setAdd(String add) {  
        this.add = add;  
    }  

    @Override  
    public Object clone() {  
        Address addr = null;  
        try{  
            addr = (Address)super.clone();  
        }catch(CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return addr;  
    }  
}  

再在Student类覆写的clone()方法中加入调用Address类的clone()方法:

@Override  
    public Object clone() {  
        Student stu = null;  
        try{  
            stu = (Student)super.clone();   //浅复制  
        }catch(CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        stu.addr = (Address)addr.clone();   //深度复制  
        return stu;  
    }  

四.其他深克隆的方法
1.工具类BeanUtils和PropertyUtils进行对象复制
2.、通过序列化实现对象的复制
序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现Serializable接口,否则无法实现序列化操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值