• 如何实现Cloneable接口?深拷贝和浅拷贝的区别?


    目录:

    1.如何实现Cloneable接口?

    2. 什么是浅拷贝? 什么是深拷贝?


    1.如何实现Clonable接口?

    Object 类中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ". 但是要想合法调用 clone 方法 , 必须要 先实现 Clonable 接口 , 否则就会抛出 CloneNotSupportedException 异常。

    实现Cloneable接口,需要注意一下四步:

    第一步:一个类首先先实现Clonable接口

    class Money implements Cloneable
    

    第二步:重写clone方法

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

    第三步:main函数抛异常

    public static void main(String[] args) throws CloneNotSupportedException 


    第四步:类型转换 ,因为clone是Object的方法,此时也叫做向下转型

     Person person2 = (Person)person.clone();


    2. 什么是浅拷贝? 什么是深拷贝?

    Cloneable 拷贝出的对象是一份“浅拷贝”。
    观察如下代码:
    1. class Money {
    2. public double m = 99.99;
    3. }
    4. class Person implements Cloneable{
    5. public Money money = new Money();
    6. @Override
    7. protected Object clone() throws CloneNotSupportedException {
    8. return super.clone();
    9. }
    10. }
    11. public class TestDemo3 {
    12. public static void main(String[] args) throws CloneNotSupportedException {
    13. Person person1 = new Person();
    14. Person person2 = (Person) person.clone();
    15. System.out.println("通过person2修改前的结果");
    16. System.out.println(person1.money.m);
    17. System.out.println(person2.money.m);
    18. person2.money.m = 13.6;
    19. System.out.println("通过person2修改后的结果");
    20. System.out.println(person1.money.m);
    21. System.out.println(person2.money.m);
    22. }
    23. }
    24. // 执行结果
    25. 通过person2修改前的结果
    26. 99.99
    27. 99.99
    28. 通过person2修改后的结果
    29. 13.6
    30. 13.6

      如上代码,我们可以看到,通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。这里就是发生了浅拷贝。

    深拷贝要求把引用money也需要改变。代码如下:
    1. class Person implements Cloneable{
    2. public Money money = new Money();
    3. @Override
    4. protected Object clone() throws CloneNotSupportedException {
    5. Person tmp = (Person) super.clone();
    6. tmp.money = (Money) this.money.clone();
    7. return tmp;
    8. }

  • 相关阅读:
    maven 本地jar打包到镜像仓库
    5G基站超200万,5G工业网关能否大规模应用?
    外贸知识:谈好订单的客户临时却要求价格优惠怎么办?
    Java 多线程 先批量执行1号任务和部分2号任务,等待1号全部任务完成后,再执行剩下的2号任务内容 - CountDownLatch
    ChatGPT全方位解析:如何培养 AI 智能对话技能?
    瑞吉外卖 —— 10、Redis
    Effective C++ 改善程序与设计的55个具体做法笔记与心得 3
    数据结构与算法-冒泡排序
    在Ubuntu系统 搭建企业GIT服务器
    多策略融合改进的均衡优化算法
  • 原文地址:https://blog.csdn.net/crazy_xieyi/article/details/126273474