Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深浅复制详解及Cloneable接口实现

深浅复制详解及Cloneable接口实现

原创
作者头像
小明爱吃火锅
发布于 2025-01-13 02:39:53
发布于 2025-01-13 02:39:53
1190
举报
文章被收录于专栏:小明说Java小明说Java

前言

Java编程中,对象复制不仅涉及到数据的传递,更关乎程序的结构设计和资源管理,深入理解深拷贝与浅拷贝的概念及其在实际编程中的应用,有助于开发者编写出更加健壮、灵活且易于维护的代码。本文将详细探讨这两种复制方式的区别,以及如何利用Java的Cloneable接口来实现它们,帮助大家在面试和实际工作中更加游刃有余地应对相关问题。

一、深拷贝与浅拷贝的区别

首先先简单介绍一下深拷贝与浅拷贝的区别:

浅拷贝

  • 浅拷贝创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
  • 如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

深拷贝

  • 深拷贝在拷贝引用类型时会拷贝地址指向的内容,而不会拷贝地址本身。
  • 深拷贝出的对象与原对象没有任何关联,修改其一不会影响另一方的任何属性。
二、为什么需要深拷贝?

为什么需要深拷贝?其实主要有下面两点优点:

  1. 避免共享引用:深拷贝确保复制的是对象的真正副本,与原对象没有引用关系,避免了修改副本影响原对象的问题。
  2. 线程安全:在多线程环境中,深拷贝可以避免多个线程同时修改同一个对象导致的数据不一致问题。
三、使用Cloneable接口实现深浅复制

接下来就用代码案例是分析讲解深拷贝与浅拷贝。

Java提供了Cloneable接口来支持对象的复制。实现Cloneable接口的类需要重写clone()方法。默认情况下,clone()方法执行的是浅拷贝。

简单例子
代码语言:java
AI代码解释
复制
public class DeepCopyTest {
    public static void main(String[] args) {
        Person originalPerson = new Person("John", 25);
        Person copiedPerson = new Person(originalPerson); // 深拷贝
        Person shallowPerson = originalPerson; // 浅拷贝

        originalPerson.setName("Mike");
        originalPerson.setAge(30);

        System.out.println("原 Person: " + originalPerson.getName() + ", " + originalPerson.getAge());
        System.out.println("深拷贝 Person: " + copiedPerson.getName() + ", " + copiedPerson.getAge());
        System.out.println("浅拷贝 Person: " + shallowPerson.getName() + ", " + shallowPerson.getAge());
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(Person person) {
        this.name = person.name;
        this.age = person.age;
    }

    // getters and setters
}

在这个上面例子中,Person类的拷贝构造函数实现了深拷贝,确保了新对象与原对象的独立性,是比较简单的一种方式,运行结果如下,发现修改原始对象属性,浅拷贝对象也会改变。

复杂例子

接下就是实现Cloneable接口,重写clone()方法,如果是浅拷贝直接返回父级clone方法即可,如果是深拷贝这需要重新创建对象,如下:

代码语言:java
AI代码解释
复制
    protected Object clone() throws CloneNotSupportedException
    {
        //浅拷贝
//        return super.clone();
        // 深拷贝,创建对象
        return new Emp(empName,age,boss.getBossName(),boss.getTitle());

    }

最终完整案例代码如下:

代码语言:java
AI代码解释
复制
public class ShallowDeepCopyDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Emp emp = new Emp("z3", 15, "雷军", "CEO");
        Emp emp2 = (Emp) emp.clone();

        emp2.getBoss().setTitle("CTO");

        System.out.println("原始对象:" + emp.getBoss().getTitle());
        System.out.println("拷贝对象:" + emp2.getBoss().getTitle());
    }
}

class Boss implements Cloneable {
    private String bossName;
    private String title;

    // 构造函数、getters and setters

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

class Emp implements Cloneable {
    private String empName;
    private Integer age;
    private Boss boss;

    // 构造函数、getters and setters

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new Emp(empName, age, boss.getBossName(), boss.getTitle()); // 深拷贝
    }
}

在这个复杂例子中,Emp类通过重写clone()方法实现了深拷贝,确保了即使修改了拷贝对象的Boss属性,也不会影响原对象的Boss属性,运行二级果如下:

四、总结
  • 深拷贝浅拷贝的主要区别在于对引用类型属性的处理方式。
  • 深拷贝可以避免共享引用带来的问题,提高程序的安全性和稳定性,这也是使用深拷贝的优点。
  • 使用Cloneable接口可以方便地实现对象的复制,但需要注意正确实现深拷贝逻辑。

Java的Cloneable接口提供了对象复制的机制,但实现深拷贝时需特别小心,确保所有引用类型属性都被正确复制,理解并正确应用这两种复制方式是编写高质量Java程序的关键,欢迎大家在评论区指点。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java中的深浅拷贝
堆(heap):主要用于存储实例化的对象,数组。由JVM动态分配内存空间,堆内存还可以用来存放由new创建的对象和数组。一个JVM只有一个堆内存,线程是可以共享数据的。
关忆北.
2021/12/07
4910
Java中的深浅拷贝
Java浅拷贝大揭秘:如何轻松复制两个不同对象的某些相同属性
在Java编程中,经常会遇到需要复制一个对象的属性到另一个对象的情况。这时,可以使用浅拷贝(Shallow Copy)来实现这个需求。那么,什么是浅拷贝呢?浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中。这样,新对象和原对象就会有相同的字段值。本文将详细介绍如何使用Java实现浅拷贝,并给出代码示例。
木头左
2024/06/10
3710
Java中深复制和浅复制
关于Java中的深复制、浅复制,网上也有很多资料解释,这里整理出来加入一些自己的想法。
用户2146693
2019/08/08
9040
Java中深复制和浅复制
关于Java的拷贝你能说出个123么?
java赋值是复制「对象引用」,如果我们想要得到一个对象的==副本==,使用赋值操作是无法达到目的的:修改新对象的值会同时修改旧对象的值。
sowhat1412
2020/12/02
3140
关于Java的拷贝你能说出个123么?
【设计模式】-创建型模式-第2章第4讲-【原型模式】
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
跟着飞哥学编程
2022/12/02
3600
一文了解Java对象的克隆,深浅拷贝(克隆)
在Java的Object类中,有一个方法名为clone(),直译过来就是克隆,核心概念就是复制对象并返回一个新的对象。
程序员小强
2020/05/14
3.4K0
详解Java中的clone方法:原型模式
clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?
哲洛不闹
2018/09/19
7690
详解Java中的clone方法:原型模式
Java基础——clone()方法浅析
一、clone的概念    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?  使用new操作符创建一个对象 使用clone方法复制一个对象    那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后
mukekeheart
2018/02/27
7500
Java基础——clone()方法浅析
好似你,饼印咁:原型模式、浅拷贝与深拷贝
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。大概意思就是:允许一个对象再创建另外一个可定制的对象,根本无需知道对象创建的细节。其工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。其UML类图如下:
BUG弄潮儿
2021/01/18
3220
好似你,饼印咁:原型模式、浅拷贝与深拷贝
Java 浅拷贝、深拷贝,你知多少?
在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存在一些误区,这篇文章会详细的介绍这三种对象克隆方式。
平头哥的技术博文
2019/12/04
8270
Java 浅拷贝和深拷贝
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。
用户3467126
2019/09/04
6940
Java 浅拷贝和深拷贝
抽象类与接口(3)(接口部分)
❤️❤️观察其内部结构我们可以知道在Comparable后面还有个<T>,在语法上这是泛型,之后会讲,这并不影响我们现在的思路,这个<T>中的T你写student类,后面的compareTo方法中的第一个参数就是student类,如上图。
E绵绵
2024/04/08
1100
抽象类与接口(3)(接口部分)
java浅拷贝和深拷贝(基础也是很重要的)
对于的github基础代码https://github.com/chywx/JavaSE
陈灬大灬海
2018/09/12
3690
java浅拷贝和深拷贝(基础也是很重要的)
Java中对象如何拷贝?
在Java中,对象拷贝可以是浅拷贝(Shallow Copy)或深拷贝(Deep Copy)。理解这两种拷贝的区别对于正确地实现对象拷贝至关重要。
王也518
2024/04/22
4270
深入浅出Java中的clone克隆方法,写得太棒了!
作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/
Java技术栈
2019/07/08
3190
深入理解Java浅拷贝与深拷贝
本文将会深入探讨Java浅拷贝和深拷贝的概念,讲解它们各自的用途、使用场景以及技巧,并通过实战案例帮助读者更好地理解这两种拷贝方式的含义。
阿珍
2025/03/24
1850
深入理解Java浅拷贝与深拷贝
面试官:Java深拷贝和浅拷贝区别
结果分析:由输出结果可以看出,它们的地址值是相同的,那么它们肯定是同一个对象。teacher和otherteacher的只是引用而已,他们都指向了一个相同的对象Teacher(“Taylor”,26)。这就叫做引用拷贝。
TimeFriends
2022/08/01
2540
Java深入理解深拷贝和浅拷贝区别
结果分析:由输出结果可以看出,它们的地址值是相同的,那么它们肯定是同一个对象。teacher和otherTeacher的只是引用而已,他们都指向了一个相同的对象Teacher(“riemann”,28)。 这就叫做引用拷贝。
全栈程序员站长
2022/11/10
2070
Java深入理解深拷贝和浅拷贝区别
Java中的深浅拷贝问题你清楚吗?
拷贝这个词想必大家都很熟悉,在工作中经常需要拷贝一份文件作为副本。拷贝的好处也很明显,相较于新建来说,可以节省很大的工作量。在Java中,同样存在拷贝这个概念,拷贝的意义也是可以节省创建对象的开销。
Java旅途
2021/01/08
7140
设计模式-原型模式(克隆羊多利看了都说好)
问题: 现在有一只羊(包含属性:名字Dolly、年龄2),需要克隆10只属性完全相同的羊。
唔仄lo咚锵
2021/09/14
3910
设计模式-原型模式(克隆羊多利看了都说好)
相关推荐
Java中的深浅拷贝
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档