Java 实体 Copy
在Java中,我们经常需要复制对象以进行操作或传递给其他方法。对象的复制可以分为浅复制和深复制。浅复制只复制对象本身,而不复制对象所引用的其他对象。而深复制则会复制对象本身和其所引用的其他对象。本文将介绍如何在Java中实现实体的复制,并提供相应的代码示例。
浅复制
浅复制是指复制对象时只复制对象本身,而不复制对象所引用的其他对象。在浅复制中,新的对象只是原始对象的一个副本,其中的引用依然指向同一个对象。因此,对新对象的修改会影响到原始对象。
在Java中,我们可以通过实现Cloneable
接口和重写clone()
方法来实现浅复制。Cloneable
是一个标记接口,用于指示该类可以被复制。下面是一个实现浅复制的示例代码:
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ShallowCopyExample {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = null;
try {
person2 = (Person) person1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
person2.setName("Bob");
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
}
}
在上面的示例中,我们创建了一个Person
类,并实现了Cloneable
接口以及重写了clone()
方法。在main()
方法中,我们首先创建了一个Person
对象person1
,然后通过调用clone()
方法创建了一个person2
对象。接着,我们修改了person2
的姓名,可以发现person1
并没有受到影响,说明这是一个浅复制。
深复制
深复制是指复制对象时不仅复制对象本身,还会复制对象所引用的其他对象。在深复制中,新的对象和原始对象是独立的,对新对象的修改不会影响到原始对象。实现深复制的方法有很多种,比如使用序列化、使用clone()
方法等。
使用序列化实现深复制
使用序列化是实现深复制的一种常见方法。通过将对象序列化为字节流,然后再将字节流反序列化为对象,可以创建一个与原始对象相同但不共享引用的新对象。下面是一个使用序列化实现深复制的示例代码:
import java.io.*;
class Address implements Serializable {
private String city;
private String street;
public Address(String city, String street) {
this.city = city;
this.street = street;
}
public void setCity(String city) {
this.city = city;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public String getStreet() {
return street;
}
}
class Person implements Serializable {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Address getAddress() {
return address;
}
public Person deepCopy() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new