当前位置: 首页 > java >正文

Java 中也存在类似的“直接引用”“浅拷贝”和“深拷贝”

Java 中也存在类似的“直接引用”“浅拷贝”和“深拷贝”概念,只是实现方式与 Python 略有不同(Java 更依赖对象的 clone() 方法和接口实现)。以下是具体对应关系和示例:

1. Java 中的“直接引用”(对应 Python 的 b = a

  • 本质:通过赋值运算符 = 让新变量指向原对象的引用,两者共享同一块内存。

  • 表现:修改任何一方的成员变量(包括基本类型和引用类型),都会影响另一方。

    示例

    class MyClass {int num;int[] arr; // 引用类型成员public MyClass(int num, int[] arr) {this.num = num;this.arr = arr;}
    }public class Main {public static void main(String[] args) {int[] arr = {1, 2};MyClass a = new MyClass(10, arr);MyClass b = a; // 直接引用,共享同一对象// 修改基本类型成员b.num = 20;System.out.println(a.num); // 20(a 被影响)// 修改引用类型成员b.arr[0] = 100;System.out.println(a.arr[0]); // 100(a 被影响)}
    }
    

2. Java 中的“浅拷贝”(对应 Python 的 a.copy()a[:]

  • 实现方式:通过重写 Object 类的 clone() 方法,并让类实现 Cloneable 接口(标记接口,无实际方法)。

  • 本质:创建新对象,复制原对象的基本类型成员,但引用类型成员仍指向原对象的引用(共享嵌套结构)。

  • 表现

    • 修改新对象的基本类型成员,原对象不受影响。
    • 修改新对象的引用类型成员,原对象会被同步影响。

    示例

    class MyClass implements Cloneable { // 实现 Cloneable 接口int num;int[] arr;public MyClass(int num, int[] arr) {this.num = num;this.arr = arr;}// 重写 clone() 实现浅拷贝@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 调用父类的 clone(),默认是浅拷贝}
    }public class Main {public static void main(String[] args) throws CloneNotSupportedException {int[] arr = {1, 2};MyClass a = new MyClass(10, arr);MyClass b = (MyClass) a.clone(); // 浅拷贝// 修改基本类型成员b.num = 20;System.out.println(a.num); // 10(a 不受影响)// 修改引用类型成员b.arr[0] = 100;System.out.println(a.arr[0]); // 100(a 被影响,共享引用)}
    }
    

3. Java 中的“深拷贝”(对应 Python 的 copy.deepcopy(a)

  • 实现方式:在浅拷贝基础上,手动对所有引用类型成员也进行拷贝(递归拷贝嵌套结构)。

  • 本质:创建完全独立的新对象,所有层级的成员(包括嵌套的引用类型)都被复制,与原对象无任何共享。

  • 表现:修改新对象的任何成员(基本类型或引用类型),原对象都不受影响。

    示例

    class MyClass implements Cloneable {int num;int[] arr;public MyClass(int num, int[] arr) {this.num = num;this.arr = arr;}// 重写 clone() 实现深拷贝@Overrideprotected Object clone() throws CloneNotSupportedException {MyClass copy = (MyClass) super.clone(); // 先浅拷贝外层copy.arr = this.arr.clone(); // 手动拷贝引用类型成员(深拷贝关键)return copy;}
    }public class Main {public static void main(String[] args) throws CloneNotSupportedException {int[] arr = {1, 2};MyClass a = new MyClass(10, arr);MyClass b = (MyClass) a.clone(); // 深拷贝// 修改基本类型成员b.num = 20;System.out.println(a.num); // 10(a 不受影响)// 修改引用类型成员b.arr[0] = 100;System.out.println(a.arr[0]); // 1(a 不受影响,嵌套结构已独立)}
    }
    

总结:Java 与 Python 的对应关系

操作类型Python 实现Java 实现核心特点
直接引用b = aMyClass b = a;完全共享,修改互相同步
浅拷贝b = a.copy()a[:]实现 Cloneable 并重写 clone()(默认浅拷贝)外层独立,嵌套结构共享
深拷贝b = copy.deepcopy(a)重写 clone() 并手动拷贝所有引用类型成员完全独立,无任何共享

Java 中没有像 Python 那样的 copy 模块自动处理深拷贝,需要手动实现嵌套对象的拷贝逻辑,这也是 Java 中深拷贝相对繁琐的原因。

http://www.xdnf.cn/news/17032.html

相关文章:

  • feign日志学习记录
  • k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC
  • VUE-第二季-01
  • python批量gif图片转jpg
  • 【DL学习笔记】深入学习tenser
  • Claude Code入门学习笔记(一)--Claude Code简介
  • ICCV 2025 | EPD-Solver:西湖大学发布并行加速扩散采样算法
  • 多线程异步日志系统与实现及 TCP/IP C/S 模型
  • 解剖 .NET 经典:从 Component 到 BackgroundWorker
  • AD方案(OpenLDAP或微软AD)适配信创存在的不足以及可能优化方案
  • Redis面试精讲 Day 9:Redis模块开发与扩展
  • 【数据迁移】Windows11 下将 Ubuntu 从 C 盘迁移到 D 盘
  • 每日面试题20:spring和spring boot的区别
  • Spring MVC 九大组件源码深度剖析(一):MultipartResolver - 文件上传的幕后指挥官
  • Go语言实战案例:TCP服务器与客户端通信
  • Uniapp一根数据线实现真机调试运行【uniapp如何把项目运行在手机上】
  • 昇思学习营-开发版-模型推理和性能优化
  • Kaggle 竞赛入门指南
  • Jetson Orin NX/NANO+ubuntu22.04+humble+MAVROS2安装教程
  • LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
  • Nginx相关实验(2)
  • Linux服务器运维告警系统搭建完整指南
  • 使用AssemblyAI将音频数据转换成文本
  • Elastic 9.1/8.19:默认启用 BBQ,ES|QL 支持跨集群搜索(CCS)正式版,JOINS 正式版,集成 Azure AI Foundry
  • uni-app学习笔记01-项目初始化及相关文件
  • 控制建模matlab练习10:滞后补偿器
  • sqli-labs:Less-25关卡详细解析
  • Go语法:闭包
  • 【银行测试】银行票据项目业务+票据测试点分析(二)
  • Android 之 网络通信(HTTP/TCP/UDP/JSON)