深克隆与浅克隆的区别及深克隆的实现方式
时间: 2024-06-11 12:09:21 浏览: 15
深克隆和浅克隆都是针对对象进行复制的概念。
浅克隆是指将对象的引用复制一份,新对象和原对象共享同一个引用的内容。也就是说,新对象和原对象中的引用类型变量指向的是同一个对象。当其中一个对象修改了该引用类型变量所指向的对象的属性时,另一个对象也会受到影响。
深克隆是指将对象的所有属性都复制一份,新对象和原对象的所有属性都是完全独立的,互不影响。
实现深克隆的方式有以下几种:
1. 递归实现:对于引用类型的属性,递归地调用其 clone 方法实现深度复制。
2. 序列化(Serialization)和反序列化(Deserialization)实现:将对象序列化成字节流,再反序列化成新对象。这种方法需要被克隆的对象实现 Serializable 接口。
3. 利用 Java 的流(Stream)实现:通过对象的读写流来实现深度复制。
4. 利用第三方库实现:比如 Apache Commons 的 SerializationUtils 类提供了深度复制对象的方法。
相关问题
浅克隆与深克隆的区别
浅克隆和深克隆是在面向对象编程中用于复制对象的两种不同方式。
浅克隆是指创建一个新对象,该对象的属性与原始对象相同,但是属性的引用仍然指向原始对象的引用。换句话说,浅克隆只复制了对象的引用,而不是对象本身。因此,如果修改了原始对象的属性,那么克隆对象的对应属性也会发生变化。
深克隆是指创建一个新对象,并且该对象的属性与原始对象相同,但是属性的引用也是全新的。换句话说,深克隆会递归地复制对象及其所有引用的对象。因此,即使修改了原始对象的属性,克隆对象的对应属性也不会受到影响。
总结一下:
- 浅克隆只复制对象的引用,而不复制对象本身。
- 深克隆会递归地复制对象及其所有引用的对象。
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
```