浅克隆与深克隆的区别
时间: 2024-06-15 18:09:53 浏览: 100
浅克隆和深克隆是在面向对象编程中用于复制对象的两种不同方式。
浅克隆是指创建一个新对象,该对象的属性与原始对象相同,但是属性的引用仍然指向原始对象的引用。换句话说,浅克隆只复制了对象的引用,而不是对象本身。因此,如果修改了原始对象的属性,那么克隆对象的对应属性也会发生变化。
深克隆是指创建一个新对象,并且该对象的属性与原始对象相同,但是属性的引用也是全新的。换句话说,深克隆会递归地复制对象及其所有引用的对象。因此,即使修改了原始对象的属性,克隆对象的对应属性也不会受到影响。
总结一下:
- 浅克隆只复制对象的引用,而不复制对象本身。
- 深克隆会递归地复制对象及其所有引用的对象。
相关问题
java 浅克隆与深克隆的区别
Java中的克隆分为浅克隆和深克隆两种方式。浅克隆只是复制了对象的引用,而不是对象本身,因此对克隆对象的修改会影响到原对象。而深克隆则是将对象及其引用对象一起复制,因此对克隆对象的修改不会影响到原对象。
以下是Java中实现浅克隆和深克隆的示例代码:
1. 浅克隆
```java
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
}
// 测试代码
Address address = new Address("Beijing");
Person person1 = new Person("Tom", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
address.setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // 输出:Shanghai
System.out.println(person2.getAddress().getCity()); // 输出:Shanghai
```
2. 深克隆
```java
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.address = (Address) address.clone();
return person;
}
}
public class Address implements Cloneable {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 测试代码
Address address = new Address("Beijing");
Person person1 = new Person("Tom", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
address.setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
```
浅克隆和深克隆的区别
### 浅克隆与深克隆的区别
#### 对象及其引用的成员变量处理差异
浅克隆仅复制对象本身以及其中的基本数据类型字段和`String`类型的字段,而对于那些指向其他对象的引用,则只是简单地复制了引用地址,这意味着两个对象仍然共享相同的子对象实例[^1]。
相比之下,深克隆不仅会创建一个新的对象实例来表示原始对象的一个副本,还会递归地为每一个非基本类型的成员变量也创建新的实例。这样做的结果是,在完成深克隆之后,源对象与其副本之间没有任何依赖关系——即使其中一个对象发生了变化也不会影响到另一个对象的状态[^4]。
#### 实现方式的不同
为了实现浅克隆,通常的做法是让目标类继承自`Cloneable`接口,并覆盖默认的`Object.clone()`方法以返回一个新实例。然而需要注意的是,默认情况下Java只提供了浅层次上的复制功能:
```java
public class ShallowClass implements Cloneable {
private int value;
private Object reference;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
要达到深层次的复制效果,有几种常见的策略可以选择,比如利用序列化机制来进行完整的对象图复制:
```java
import java.io.*;
public class DeepCopyUtil {
public static <T extends Serializable> T deepCopy(T object) throws IOException, ClassNotFoundException {
// 序列化过程
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(object);
// 反序列化过程
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
return (T)in.readObject();
}
}
```
另一种更直接的方法就是手动编写构造函数或其他辅助方法来逐层构建所需的新对象结构,确保所有内部组件都被正确初始化而不是共用了旧有的引用[^3]。
阅读全文
相关推荐













