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"
由于浅拷贝只复制引用地址,所以修改一个对象的属性会影响到其他对象。
如何实现浅拷贝?
为了实现浅拷贝,我们可以使用以下方法之一:
- 重写
clone()
方法:clone()
方法是Object
类中的一个方法,用于创建并返回一个对象的副本。为了使用clone()
方法,我们需要在实体类中实现Cloneable
接口,并重写clone()
方法。
public class Person implements Cloneable {
//...
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
- 使用拷贝构造函数:拷贝构造函数是指在类中定义一个构造函数,其参数为同类型的对象,并将传入的对象的属性值复制给新创建的对象。
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
。
浅拷贝的适用场景
浅拷贝适用于以下情况:
- 当对象的字段都是基本数据类型时;
- 当对象的字段都是不可变类型时。
浅拷贝可以提高程序的性能,因为它只复制对象的引用地址,而不需要复制整个对象。但需要注意的是,由于浅拷贝只复制引用地址,修改一个对象的属性会影响到其他对象。