用java语言举个深拷贝和浅拷贝的例子
时间: 2024-08-14 09:06:50 浏览: 47
在Java中,深拷贝和浅拷贝主要用于复制对象时区分完全独立的副本和共享资源的情况。下面分别给出两个例子:
**浅拷贝(Shallow Copy)示例:**
假设有一个Person类,它包含一个Address对象作为成员变量。
```java
class Address {
String street;
}
class Person {
Address address;
}
```
浅拷贝可以通过简单的赋值操作创建一个新的Person实例,因为地址是引用类型:
```java
public class Main {
public static void main(String[] args) {
Address addr = new Address();
addr.street = "Home";
Person person1 = new Person(addr);
Person person2 = person1; // 浅拷贝
person2.address.street = "Office"; // 修改person2的address
System.out.println(person1.address.street); // 输出 "Office",因为两个引用指向同一个地址对象
}
}
```
在这个例子中,修改person2的address会影响到person1。
**深拷贝(Deep Copy)示例:**
为了实现深拷贝,我们需要创建一个全新的Address对象,并将其分配给新的Person实例:
```java
import java.util.ArrayList;
class Address {
ArrayList<String> streets = new ArrayList<>();
}
class Person {
Address address;
}
public class DeepCopyExample {
public static Address deepCopy(Address original) {
Address copy = new Address();
copy.streets.addAll(original.streets);
return copy;
}
public static void main(String[] args) {
Address addr = new Address();
addr.streets.add("Home");
Person person1 = new Person(deepCopy(addr));
Person person2 = person1; // 深拷贝
person2.address.streets.add("Office"); // 修改person2的address不影响person1
System.out.println(person1.address.streets); // 输出 ["Home"], 因为person1有自己的独立地址副本
}
}
```
这里通过`deepCopy()`方法实现了地址对象的深拷贝,使得两个Person实例拥有各自独立的地址对象。
阅读全文