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