在面向对象编程中,复制对象通常涉及到对象的深拷贝(Deep Copy)和浅拷贝(Shallow Copy)。深拷贝会创建一个新对象,并递归复制原对象中的所有子对象,新对象与原对象完全独立。浅拷贝则只是复制对象的引用,新对象与原对象共享相同的子对象。
clone()
方法(如果实现了Cloneable
接口)。public class ShallowCopyExample implements Cloneable {
private int[] data;
public ShallowCopyExample() {
data = new int[]{1, 2, 3};
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
ShallowCopyExample original = new ShallowCopyExample();
ShallowCopyExample copy = (ShallowCopyExample) original.clone();
// 修改原对象的数组
original.data[0] = 99;
// 输出两个对象的数组
System.out.println(Arrays.toString(original.data)); // [99, 2, 3]
System.out.println(Arrays.toString(copy.data)); // [99, 2, 3]
}
}
import java.io.*;
public class DeepCopyExample implements Serializable {
private int[] data;
public DeepCopyExample() {
data = new int[]{1, 2, 3};
}
public DeepCopyExample 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 (DeepCopyExample) ois.readObject();
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
DeepCopyExample original = new DeepCopyExample();
DeepCopyExample copy = original.deepCopy();
// 修改原对象的数组
original.data[0] = 99;
// 输出两个对象的数组
System.out.println(Arrays.toString(original.data)); // [99, 2, 3]
System.out.println(Arrays.toString(copy.data)); // [1, 2, 3]
}
}
原因:浅拷贝只复制了对象的引用,新对象与原对象共享相同的子对象。
解决方法:使用深拷贝来确保新对象与原对象完全独立。
原因:深拷贝需要递归复制所有子对象,对于复杂的数据结构,性能开销较大。
解决方法:
通过以上内容,您可以了解如何为特定对象复制通用对象的内容,并根据具体需求选择合适的拷贝方式。
领取专属 10元无门槛券
手把手带您无忧上云