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

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.dtcms.com/a/313367.html

相关文章:

  • [创业之路-530]:创业公司五维架构设计:借鉴国家治理智慧,打造敏捷型组织生态
  • mysql8.0集群技术
  • 第13章 文件输入/输出
  • 知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 KL散度公式对应
  • 文件拷贝-代码
  • Doris json_contains 查询报错
  • 数据结构总纲以及单向链表详解:
  • 【LeetCode刷题指南】--对称二叉树,另一颗树的子树
  • [创业之路-531]:知识、技能、技术、科学之间的区别以及它们对于职业的选择的指导作用?
  • 【OpenGL】LearnOpenGL学习笔记02 - 绘制三角形、矩形
  • 13-day10生成式任务
  • 基于MBA与BP神经网络分类模型的特征选择方法研究(Python实现)
  • 在ANSYS Maxwell中对永磁体无线充电进行建模
  • 【大模型核心技术】Agent 理论与实战
  • 【设计模式】5.代理模式
  • Manus AI与多语言手写识别
  • 什么是“痛苦指数”(Misery Index)?
  • 如何获取网页中点击按钮跳转后的链接呢
  • 在 Cursor 中设置浅色背景和中文界面
  • 抽奖系统中 Logback 的日志配置文件说明
  • 03.一键编译安装Redis脚本
  • 【MySQL】MySQL 中的数据排序是怎么实现的?
  • 深入理解流式输出:原理、应用与大模型聊天软件中的实现
  • 跨语言模型中的翻译任务:XLM-RoBERTa在翻译任务中的应用
  • python---python中的内存分配
  • AI Agent 重塑产业发展新格局
  • 联想笔记本安装系统之后一直转圈圈的问题了?无法正常进入到系统配置界面,原来是BIOS中的VMD问题
  • Autoswagger:揭露隐藏 API 授权缺陷的开源工具
  • 使用CMake构建项目的完整指南
  • [LINUX操作系统]shell脚本之循环