java的深拷贝与浅拷贝
时间: 2023-10-17 08:34:13 浏览: 167
在 Java 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于描述对象拷贝的概念。
浅拷贝是指创建一个新对象,新对象的属性值和原对象的属性值相同,但是对于引用类型的属性,新旧对象将共享同一个引用。也就是说,新旧对象的引用类型属性指向同一个内存地址。
深拷贝则是在拷贝对象时,不仅会复制对象本身,还会递归复制对象的引用类型属性,使得新对象和原对象的引用类型属性指向不同的内存地址。
Java 中的默认拷贝行为是浅拷贝。可以通过以下两种方式实现深拷贝:
1. 实现 `Cloneable` 接口并重写 `clone()` 方法:这是一种较为简单的实现深拷贝的方式。在需要进行深拷贝的类中,实现 `Cloneable` 接口,并重写 `clone()` 方法,在 `clone()` 方法中递归复制引用类型的属性。
```java
class MyClass implements Cloneable {
private int number;
private MyObject myObject;
// constructors, getters, setters
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.myObject = (MyObject) myObject.clone(); // 实现 MyObject 的 clone() 方法
return cloned;
}
}
```
通过调用 `clone()` 方法来创建一个新的深拷贝对象:`MyClass clonedObject = (MyClass) originalObject.clone();`
2. 使用序列化和反序列化:这是另一种实现深拷贝的方式。通过将对象序列化为字节流,然后再将字节流反序列化为新的对象,可以实现深拷贝。这种方式需要确保对象及其引用类型属性都是可序列化的。
```java
import java.io.*;
class MyClass implements Serializable {
// class definition
}
```
```java
// 实现深拷贝的方法
public static <T extends Serializable> T deepCopy(T object) throws IOException, ClassNotFoundException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return (T) objectInputStream.readObject();
}
```
通过调用 `deepCopy()` 方法来创建一个新的深拷贝对象:`MyClass clonedObject = deepCopy(originalObject);`
需要注意的是,为了实现深拷贝,引用类型的类也需要实现 `Cloneable` 接口并重写 `clone()` 方法,或者是可序列化的。
希望这些信息对你有所帮助。如果你还有其他问题,请随时提问。
阅读全文