Java 对象复制的流程
Java 对象复制是指将一个对象的属性值复制到另一个对象中,使得两个对象的属性值相同。实现对象复制的流程如下:
步骤 | 描述 |
---|---|
1 | 创建一个新的对象 |
2 | 将原对象的属性值复制到新对象中 |
下面我将详细介绍每一步需要做什么,以及需要使用的代码。
步骤1:创建一个新的对象
在 Java 中,可以使用 new
关键字来创建一个新的对象。具体的代码如下:
ClassName newObj = new ClassName();
这里的 ClassName
是要复制的对象的类名,newObj
是新创建的对象。
步骤2:将原对象的属性值复制到新对象中
在 Java 中,可以通过两种方式来复制对象的属性值:浅拷贝和深拷贝。
浅拷贝
浅拷贝是指将原对象的属性值逐个复制到新对象中,如果属性是基本数据类型,直接复制;如果属性是引用类型,复制引用地址。浅拷贝的代码如下:
newObj = origObj.clone();
这里的 origObj
是要复制的原对象,clone()
方法是 Object 类中的一个方法,通过实现 Cloneable 接口来实现对象的浅拷贝。
深拷贝
深拷贝是指将原对象的属性值全部复制到新对象中,包括引用类型的属性值。深拷贝通常需要使用序列化和反序列化来实现。代码如下:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(origObj);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
newObj = (ClassName) ois.readObject();
这里的 origObj
是要复制的原对象,ClassName
是要复制的对象的类名,ByteArrayOutputStream
和 ObjectOutputStream
是序列化的输出流,ByteArrayInputStream
和 ObjectInputStream
是反序列化的输入流。
完整代码示例
下面是一个完整的示例代码,演示了如何实现对象复制:
public class CopyExample {
public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
// 步骤1:创建一个新的对象
Student origObj = new Student("John", 20);
// 步骤2:将原对象的属性值复制到新对象中
// 浅拷贝
Student newObj1 = origObj.clone();
// 深拷贝
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(origObj);
oos.flush();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
Student newObj2 = (Student) ois.readObject();
System.out.println("原对象:" + origObj);
System.out.println("浅拷贝:" + newObj1);
System.out.println("深拷贝:" + newObj2);
}
}
class Student implements Cloneable, Serializable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Student clone() throws CloneNotSupportedException {
return (Student) super.clone();
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在上面的示例中,Student
类实现了 Cloneable
接口,并重写了 clone()
方法来实现浅拷贝。同时,Student
类还实现了 Serializable
接口,通过序列化和反序列化来实现深拷贝。通过运行上述代码,可以得到如下输出:
原对象:Student{name='John', age=20}
浅拷贝:Student{name='John', age=20}
深拷贝:Student{name='John', age=20}
可以看到,浅拷贝和深拷贝都实现了对象的复制,新对象的属性值与原对象相同。