Java浅拷贝实体类

在Java编程中,经常会遇到需要复制实体类对象的情况。有时候,我们只需要复制对象的基本数据类型属性,而不需要复制引用类型属性。这时候,浅拷贝(Shallow Copy)就派上用场了。本文将介绍什么是浅拷贝,以及如何在Java中实现浅拷贝。

什么是浅拷贝?

浅拷贝是指复制对象时,将对象的字段值复制到新对象中,如果字段是基本数据类型,则复制其值;如果字段是引用类型,则复制引用地址。换句话说,浅拷贝只复制对象的引用而不是对象本身。

下面是一个实例来帮助我们理解浅拷贝:

public class Person {
    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;
    }
    
    // getters and setters
}

public class Address {
    private String city;
    private String street;

    public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
    
    // getters and setters
}

在上面的代码中,我们有一个Person类和一个Address类。Person类包含一个name属性(String类型),一个age属性(int类型),以及一个address属性(引用类型,指向Address对象)。

现在,我们创建一个Person对象,并将其复制给另一个对象:

Address address = new Address("City", "Street");
Person person1 = new Person("Alice", 30, address);
Person person2 = person1;

在上述代码中,我们尝试复制person1对象给person2对象。但这并不是真正的复制,而是将person2指向了person1。这意味着,如果我们修改person1的属性,person2的属性也会随之改变。

person1.setName("Bob");
System.out.println(person1.getName());  // 输出 "Bob"
System.out.println(person2.getName());  // 输出 "Bob"

由于浅拷贝只复制引用地址,所以修改一个对象的属性会影响到其他对象。

如何实现浅拷贝?

为了实现浅拷贝,我们可以使用以下方法之一:

  1. 重写clone()方法:clone()方法是Object类中的一个方法,用于创建并返回一个对象的副本。为了使用clone()方法,我们需要在实体类中实现Cloneable接口,并重写clone()方法。
public class Person implements Cloneable {
    //...

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
}
  1. 使用拷贝构造函数:拷贝构造函数是指在类中定义一个构造函数,其参数为同类型的对象,并将传入的对象的属性值复制给新创建的对象。
public class Person {
    //...

    public Person(Person person) {
        this.name = person.getName();
        this.age = person.getAge();
        this.address = person.getAddress();
    }
}

使用上述两种方法,我们可以实现浅拷贝。下面是使用拷贝构造函数实现浅拷贝的示例代码:

Address address = new Address("City", "Street");
Person person1 = new Person("Alice", 30, address);
Person person2 = new Person(person1);

在上述代码中,我们通过传入person1对象创建了一个新的person2对象,并将person1的属性复制给了person2

浅拷贝的适用场景

浅拷贝适用于以下情况:

  • 当对象的字段都是基本数据类型时;
  • 当对象的字段都是不可变类型时。

浅拷贝可以提高程序的性能,因为它只复制对象的引用地址,而不需要复制整个对象。但需要注意的是,由于浅拷贝只复制引用地址,修改一个对象的属性会影响到其他对象。

总结