java拷贝(clone)

java使用赋值符号(=)给对象赋值时(A a=b;),并不是将b对象的值给赋值给a,而是a对象指向b对象的引用地址,两者同时引用一个地址,所以任何一个对象属性值的改变将会引起另一个对象属性值的改变,基本类型使用赋值是值拷贝。

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Admin admin=new Admin();
        Admin admin1=admin;
        System.out.println(admin1);
        System.out.println(admin);
    }
}

com.example.domain.Admin@816f27d
com.example.domain.Admin@816f27d

要实现对象的拷贝可以使用Object类中的clone方法,拷贝分为深拷贝和浅拷贝。

浅拷贝

结论:基本类型值拷贝,子对象共享。
在这里插入图片描述

实现方法
1、实现接口Cloneable(该接口为标记接口无实现方法,用于标记开发者了解拷贝过程,不写会抛出CloneNotSupportedException 异常)
2、重写Object类的clone方法,并将protected权限改为public

如果共享子对象是不可变的(如String)浅拷贝是安全的。


public class Admin extends Entity implements Cloneable{
	//子对象
    private AnswerOption answerOption;
    
    /*浅拷贝*/
    @Override
    public Object clone() throws CloneNotSupportedException {

        return super.clone();
    }
}

public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Admin admin=new Admin();
        AnswerOption answerOption=new AnswerOption();
        admin.setAnswerOption(answerOption);
        Admin admin1= (Admin) admin.clone();
        //对象引用地址
        System.out.println(admin1);
        System.out.println(admin);
        //子对象引用地址
        System.out.println(admin1.getAnswerOption());
        System.out.println(admin.getAnswerOption());
    }
}

print:

com.example.domain.Admin@816f27d
com.example.domain.Admin@87aac27
com.example.domain.AnswerOption@3e3abc88
com.example.domain.AnswerOption@3e3abc88

结论:基本类型值拷贝,子对象共享。

深拷贝

结论:通通拷贝
在这里插入图片描述

实现方法
1、实现接口Cloneable(该接口为标记接口无实现方法,用于标记开发者了解拷贝过程,不写会抛出CloneNotSupportedException 异常)
2、重写Object类的clone方法,自定义规则,并将protected权限改为public

public class Admin extends Entity implements Cloneable{
	//子对象
    private AnswerOption answerOption;
    //深拷贝
    @Override
    public Admin clone() throws CloneNotSupportedException{
        Admin admin= (Admin) super.clone();
        //通过子对象的拷贝子对象(数组自带public的clone)
        admin.answerOption= (AnswerOption) answerOption.clone();
        return admin;
    }
}
public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Admin admin=new Admin();
        AnswerOption answerOption=new AnswerOption();
        admin.setAnswerOption(answerOption);
        Admin admin1= (Admin) admin.clone();
        //对象引用地址
        System.out.println(admin1);
        System.out.println(admin);
        //子对象引用地址
        System.out.println(admin1.getAnswerOption());
        System.out.println(admin.getAnswerOption());
    }
}

print:

com.example.domain.Admin@816f27d
com.example.domain.Admin@87aac27
com.example.domain.AnswerOption@3e3abc88
com.example.domain.AnswerOption@6ce253f1

结论:通通拷贝的干活

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值