java种浅拷贝和深拷贝的例子
时间: 2025-05-31 17:51:42 浏览: 22
### 浅拷贝与深拷贝的区别
在 Java 中,浅拷贝和深拷贝是对象复制的两种不同方式。浅拷贝仅复制对象本身的字段值,而对于引用类型的字段,则不会创建新对象,而是共享同一个实例;而深拷贝会递归地复制整个对象图,从而确保源对象及其内部引用的对象都被独立复制。
#### 示例代码:浅拷贝
以下是浅拷贝的一个简单示例:
```java
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Person original = new Person("Alice", 25);
Person copy = (Person) original.clone();
System.out.println("Original Name: " + original.getName());
System.out.println("Copied Name: " + copy.getName());
// 修改副本中的属性
copy.setName("Bob");
System.out.println("After Modification:");
System.out.println("Original Name: " + original.getName()); // 输出 Alice
System.out.println("Copied Name: " + copy.getName()); // 输出 Bob
}
}
```
此代码展示了如何通过 `clone()` 方法实现浅拷贝[^4]。由于 `name` 和 `age` 是基本类型或不可变对象,因此修改副本不会影响原始对象。
---
#### 示例代码:深拷贝
当对象包含可变引用类型时,需要手动实现深拷贝以避免共享同一引用的问题。以下是一个深拷贝的例子:
```java
import java.util.ArrayList;
import java.util.List;
class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
class Employee implements Cloneable {
private String name;
private List<Address> addresses;
public Employee(String name, List<Address> addresses) {
this.name = name;
this.addresses = addresses;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Employee clonedEmployee = (Employee) super.clone(); // 创建浅拷贝
clonedEmployee.addresses = new ArrayList<>();
for (Address address : this.addresses) {
clonedEmployee.addresses.add((Address) address.clone()); // 手动克隆地址列表
}
return clonedEmployee;
}
public String getName() {
return name;
}
public List<Address> getAddresses() {
return addresses;
}
}
public class DeepCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address home = new Address("New York");
Address office = new Address("San Francisco");
List<Address> originalAddresses = new ArrayList<>();
originalAddresses.add(home);
originalAddresses.add(office);
Employee original = new Employee("John Doe", originalAddresses);
Employee copy = (Employee) original.clone();
// 修改副本中的地址信息
copy.getAddresses().get(0).setCity("Los Angeles");
System.out.println("Original Home City: " + original.getAddresses().get(0).getCity()); // 输出 New York
System.out.println("Copied Home City: " + copy.getAddresses().get(0).getCity()); // 输出 Los Angeles
}
}
```
在此示例中,`Employee` 类实现了深拷贝逻辑,不仅调用了父类的 `clone()` 方法完成浅拷贝操作,还对手动管理的复杂引用类型进行了逐层复制[^4]。
---
### 总结
- **浅拷贝**:仅复制对象本身的基本变量值,对于引用类型的成员变量则不创建新的对象,而是继续共享原有对象的引用[^1][^2]。
- **深拷贝**:除了复制对象本身外,还会递归地复制其所有引用类型的成员变量,形成全新的对象树结构[^3]。
---
阅读全文
相关推荐


















