java 实现深拷贝
时间: 2024-03-13 13:40:08 浏览: 72
在Java中实现深拷贝有几种方式,下面是其中两种常用的方式:
1. 使用Cloneable接口和clone()方法:
Java中的Object类提供了一个clone()方法,通过实现Cloneable接口并重写clone()方法,可以实现对象的深拷贝。具体步骤如下:
- 在需要进行深拷贝的类中实现Cloneable接口。
- 重写clone()方法,在方法内部使用super.clone()进行浅拷贝,然后对引用类型的属性进行深拷贝。
- 在使用时,通过调用clone()方法创建一个新的对象。
以下是一个示例代码:
```java
public class MyClass implements Cloneable {
private int number;
private MyObject myObject;
public MyClass(int number, MyObject myObject) {
this.number = number;
this.myObject = myObject;
}
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.myObject = (MyObject) myObject.clone();
return cloned;
}
}
public class MyObject implements Cloneable {
// ...
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
2. 使用序列化和反序列化:
另一种实现深拷贝的方式是通过将对象进行序列化和反序列化来创建一个新的对象。具体步骤如下:
- 在需要进行深拷贝的类中实现Serializable接口。
- 将对象写入到一个字节流中,然后再从字节流中读取出来,即可得到一个新的对象。
以下是一个示例代码:
```java
import java.io.*;
public class MyClass implements Serializable {
private int number;
private MyObject myObject;
public MyClass(int number, MyObject myObject) {
this.number = number;
this.myObject = myObject;
}
public MyClass deepCopy() 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 (MyClass) ois.readObject();
}
}
public class MyObject implements Serializable {
// ...
}
```
这两种方式都可以实现深拷贝,具体选择哪种方式取决于具体的需求和场景。
阅读全文