java浅拷贝与深拷贝的实例
时间: 2025-05-12 22:38:42 浏览: 21
### Java 中浅拷贝与深拷贝的区别及其实现
#### 浅拷贝 (Shallow Copy)
在 Java 中,浅拷贝是指创建一个新的对象,并将原始对象的字段值复制到新对象中。如果字段是基本数据类型,则会直接复制其值;如果是引用数据类型,则只复制引用地址而不是实际的对象实例[^1]。这意味着两个对象共享同一个被引用的数据。
以下是通过 `clone()` 方法实现浅拷贝的一个简单例子:
```java
class ShallowCopyExample implements Cloneable {
int value;
String reference;
public ShallowCopyExample(int value, String reference) {
this.value = value;
this.reference = reference;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
ShallowCopyExample original = new ShallowCopyExample(42, "Test");
ShallowCopyExample copy = (ShallowCopyExample) original.clone();
System.out.println(copy.value); // 输出 42
System.out.println(copy.reference); // 输出 Test
System.out.println(original == copy); // false
System.out.println(original.reference == copy.reference); // true 表明引用相同
}
}
```
#### 深拷贝 (Deep Copy)
相比之下,深拷贝不仅复制对象本身,还递归地复制该对象所包含的所有子对象。这样可以确保源对象及其内部引用的对象都不会受到目标对象修改的影响[^3]。要实现深拷贝,通常需要手动编写逻辑来克隆所有的嵌套对象。
下面是一个使用序列化技术完成深拷贝的例子:
```java
import java.io.*;
class DeepCopyExample implements Serializable {
int value;
String reference;
public DeepCopyExample(int value, String reference) {
this.value = value;
this.reference = reference;
}
public DeepCopyExample deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (DeepCopyExample) ois.readObject();
}
}
public class Main {
public static void main(String[] args) throws Exception {
DeepCopyExample original = new DeepCopyExample(99, "Original Reference");
DeepCopyExample copy = original.deepClone();
System.out.println(copy.value); // 输出 99
System.out.println(copy.reference); // 输出 Original Reference
System.out.println(original == copy); // false
System.out.println(original.reference == copy.reference); // false 表明引用不相同
}
}
```
上述代码展示了如何利用 Java 的序列化机制来进行深拷贝操作。注意,在某些情况下可能还需要考虑性能优化或者自定义克隆行为等问题。
#### 总结差异
- **浅拷贝**仅复制基础数据类型的值和引用数据类型的指针[^2]。
- **深拷贝**则完全独立于原对象之外重新构建整个结构树。
---
阅读全文
相关推荐

















