阅读量:0
在 Java 中实现对象的深拷贝通常有以下几种方式:
- 使用序列化和反序列化:将对象序列化为字节流,然后再反序列化为一个新的对象。这种方式需要确保对象及其所有相关对象都实现了 Serializable 接口。
import java.io.*; public class DeepCopyExample { public static <T> T deepCopy(T obj) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.close(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); T copy = (T) ois.readObject(); ois.close(); return copy; } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) { // 示例:深拷贝一个对象 MyClass obj1 = new MyClass(); MyClass obj2 = deepCopy(obj1); } }
- 使用 Cloneable 接口和 clone() 方法:让对象实现 Cloneable 接口,并重写 clone() 方法,确保在 clone() 方法中对所有引用类型成员变量进行深拷贝。
public class MyClass implements Cloneable { private int value; private MyOtherClass other; // 重写 clone() 方法 @Override public MyClass clone() { try { MyClass copy = (MyClass) super.clone(); copy.other = this.other.clone(); // 对引用类型成员变量进行深拷贝 return copy; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } public class MyOtherClass implements Cloneable { // 其他类的克隆方法同样需要对引用类型成员变量进行深拷贝 @Override public MyOtherClass clone() { try { return (MyOtherClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
以上是两种常见的实现对象深拷贝的方式,选择合适的方式取决于具体的需求和对象结构。