Java对象复制(直接赋值,浅拷贝,深拷贝)
时间: 2023-07-21 14:11:14 浏览: 189
Java对象的复制三种方式(小结)
Java中对象的复制可以分为直接赋值、浅拷贝和深拷贝三种方式。
1. 直接赋值:直接将一个对象赋值给另一个对象,两个对象指向同一个内存地址,修改其中一个对象会影响另一个对象。
示例代码:
```java
SomeClass obj1 = new SomeClass();
SomeClass obj2 = obj1; // 直接赋值
```
2. 浅拷贝(Shallow Copy):创建一个新的对象,然后将原始对象的非静态字段值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制引用,两个对象将共享同一份数据。修改其中一个对象的引用类型字段会影响另一个对象。
示例代码:
```java
class SomeClass implements Cloneable {
private int value;
private List<String> list;
public SomeClass() {
list = new ArrayList<>();
}
@Override
protected SomeClass clone() throws CloneNotSupportedException {
return (SomeClass) super.clone();
}
}
SomeClass obj1 = new SomeClass();
obj1.setValue(10);
obj1.getList().add("item1");
SomeClass obj2 = obj1.clone(); // 浅拷贝
System.out.println(obj2.getValue()); // 输出 10
System.out.println(obj2.getList()); // 输出 [item1]
obj2.setValue(20);
obj2.getList().add("item2");
System.out.println(obj1.getValue()); // 输出 10
System.out.println(obj1.getList()); // 输出 [item1, item2]
```
3. 深拷贝(Deep Copy):创建一个新的对象,然后将原始对象的所有字段值复制到新对象中,包括引用类型的字段。这样两个对象完全独立,修改其中一个对象不会影响另一个对象。
示例代码:
```java
class SomeClass implements Cloneable {
private int value;
private List<String> list;
public SomeClass() {
list = new ArrayList<>();
}
@Override
protected SomeClass clone() throws CloneNotSupportedException {
SomeClass cloned = (SomeClass) super.clone();
cloned.list = new ArrayList<>(list); // 创建新的 ArrayList 对象,复制原始对象的数据
return cloned;
}
}
SomeClass obj1 = new SomeClass();
obj1.setValue(10);
obj1.getList().add("item1");
SomeClass obj2 = obj1.clone(); // 深拷贝
System.out.println(obj2.getValue()); // 输出 10
System.out.println(obj2.getList()); // 输出 [item1]
obj2.setValue(20);
obj2.getList().add("item2");
System.out.println(obj1.getValue()); // 输出 10
System.out.println(obj1.getList()); // 输出 [item1]
```
需要注意的是,如果要实现深拷贝,引用类型的字段也需要实现 Cloneable 接口并重写 clone() 方法。另外,还可以使用序列化和反序列化实现深拷贝。
阅读全文