Java 浅复制与深复制
在 Java 中,浅复制和深复制在引用地址和参数传递方面有明确区别:
1. 引用地址变化
总结:无论是浅复制还是深复制,原对象和复制出的新对象的引用地址都是不同的。唯一的区别在于内部引用类型字段是否共享地址。
2. 参数传递
Java 中参数传递始终是值传递:
- 浅复制:被复制对象的基本数据类型字段会被复制一份新值,但引用类型字段会直接复制原对象的引用地址(即指向同一个对象)。因此,原对象和复制对象的引用地址不同,但它们内部的引用类型字段共享相同的地址。
- 深复制:不仅复制基本数据类型字段,还会对引用类型字段创建全新的对象(递归复制)。因此,原对象和复制对象的引用地址不同,且它们内部的引用类型字段也指向不同的地址。
示例:
public class CopyExample {static class Person {String name;Person(String name) { this.name = name; }}// 尝试修改引用指向static void changeReference(Person p) {p = new Person("新名字"); // 仅修改方法内的副本引用}// 修改对象内部字段static void changeField(Person p) {p.name = "修改后的名字"; // 影响原对象(共享引用)}public static void main(String[] args) {Person p = new Person("原名字");changeReference(p);System.out.println(p.name); // 输出:原名字(引用未变)changeField(p);System.out.println(p.name); // 输出:修改后的名字(字段被改)} }
关键结论
- 传递基本类型时,传递的是值的副本,修改参数不会影响原变量。
- 传递引用类型时,传递的是引用地址的副本(即指向同一个对象)。因此:
- 若在方法中修改对象的字段,原对象会受影响(因为指向同一对象)。
- 若在方法中让引用指向新对象,原引用不会受影响(因为传递的是地址副本)。
- 浅复制和深复制都会产生新对象(引用地址不同),区别在于内部引用类型是否共享。
- Java 参数传递是值传递,引用类型传递的是地址副本,因此可能通过参数修改对象内容,但无法直接修改原引用的指向。