在编程中,克隆通常用于创建一个与原始对象相同的副本。克隆可以分为两种主要类型:浅克隆和深克隆。
浅克隆(Shallow Clone)
浅克隆只复制对象本身,而不复制对象所引用的其他对象。
这意味着原始对象和克隆对象共享相同的引用对象,对引用对象的修改会影响到原对象和克隆对象。
浅克隆通常可以通过实现`Cloneable`接口和重写`clone()`方法来实现。
深克隆(Deep Clone)
深克隆不仅复制对象本身,还会递归地复制对象所引用的其他对象。
这样,新对象与原对象完全独立,修改其中一个对象的属性不会影响另一个对象。
实现深克隆可以通过序列化和反序列化、手动递归复制等方式实现。
示例代码
浅克隆示例
```java
import java.util.Objects;
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError("Cloning failed", e);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ShallowCloneExample {
public static void main(String[] args) {
Person original = new Person("Alice", 25);
Person clone = original.clone();
System.out.println("Original: " + original);
System.out.println("Clone: " + clone);
clone.name = "Bob";
System.out.println("After modifying clone.name: " + clone);
System.out.println("Original after clone.name modification: " + original);
}
}
```
深克隆示例
```java
import java.io.*;
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Person) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new AssertionError("Cloning failed", e);
}
}
// Other methods like equals, hashCode, and toString remain the same
}
public class DeepCloneExample {
public static void main(String[] args) {
Person original = new Person("Alice", 25);
Person clone = original.clone();
System.out.println("Original: " + original);
System.out.println("Clone: " + clone);
clone.name = "Bob";
System.out.println("After modifying clone.name: " + clone);
System.out.println("Original after clone.name modification: " + original);
}
}
```
应用场景
对象备份和恢复:通过克隆可以保存对象的状态,并在需要时恢复到之前的状态。
批量创建相似对象:在需要多个相似对象时,可以通过克隆一个已有的对象来创建多个副本。
对象比较和修改:通过比较原对象与克隆对象的差异,可以判断对象是否被修改,并在克隆对象上进行修改而不影响原对象