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 = a | MyClass b = a; | 完全共享,修改互相同步 |
浅拷贝 | b = a.copy() 或 a[:] | 实现 Cloneable 并重写 clone() (默认浅拷贝) | 外层独立,嵌套结构共享 |
深拷贝 | b = copy.deepcopy(a) | 重写 clone() 并手动拷贝所有引用类型成员 | 完全独立,无任何共享 |
Java 中没有像 Python 那样的 copy
模块自动处理深拷贝,需要手动实现嵌套对象的拷贝逻辑,这也是 Java 中深拷贝相对繁琐的原因。