帮我用java实现一个深度拷贝
时间: 2024-03-16 17:41:43 浏览: 16
好的,这里给您提供一个使用Java实现的深度拷贝示例代码:
```java
import java.io.*;
public class DeepCopy implements Serializable {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建原始对象
Student student = new Student("张三", 18, new Address("北京市", "朝阳区", "100000"));
// 调用深度克隆方法,返回克隆后的新对象
Student cloneStudent = clone(student);
// 修改原始对象的属性值
student.setName("李四");
student.setAge(20);
student.getAddress().setProvince("广东省");
// 输出结果,可以看到原始对象和克隆对象的属性值完全独立
System.out.println("原始对象:" + student);
System.out.println("克隆对象:" + cloneStudent);
}
/**
* 深度克隆方法
* @param obj 要克隆的对象
* @return 克隆后的新对象
* @throws IOException
* @throws ClassNotFoundException
*/
public static Object clone(Object obj) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
/**
* 学生类,包含姓名、年龄和地址三个属性
*/
class Student implements Serializable {
private String name;
private int age;
private Address address;
public Student(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// 省略 getter 和 setter 方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
/**
* 地址类,包含省、市、区三个属性
*/
class Address implements Serializable {
private String province;
private String city;
private String district;
public Address(String province, String city, String district) {
this.province = province;
this.city = city;
this.district = district;
}
// 省略 getter 和 setter 方法
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
", district='" + district + '\'' +
'}';
}
}
```
这个示例代码中,我们定义了一个学生类`Student`和一个地址类`Address`,并在`Student`类中包含一个`Address`对象。我们使用Java的序列化机制,将原始对象写入字节流,然后再从字节流中读取出来,这样就可以得到一个全新的、与原始对象完全独立的对象,达到了深度拷贝的效果。