在 Java 中,对象克隆指的是创建一个与原始对象具有相同属性的新对象。对象克隆通常分为浅克隆和深克隆两种方式。浅克隆只会复制对象本身,而深克隆会连同对象内部的所有引用对象一起复制。
浅克隆
Java 中提供了 Cloneable 接口和 clone() 方法来实现对象的浅克隆。使用浅克隆时,只需实现 Cloneable 接口并重写 clone() 方法即可。下面是一个简单的示例:
// www.javascriptcn.com code example
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) {
Person person1 = new Person("Alice", 30);
try {
Person person2 = (Person) person1.clone();
System.out.println(person2.getName()); // 输出 "Alice"
System.out.println(person2.getAge()); // 输出 30
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}在上面的示例中,Person 类实现了 Cloneable 接口并重写了 clone() 方法。在 main 方法中,我们创建了一个 Person 对象 person1,然后通过 clone() 方法克隆了一个新的 Person 对象 person2。
深克隆
要实现对象的深克隆,需要在对象的 clone() 方法中对所有引用对象进行递归复制。下面是一个深克隆的示例:
// www.javascriptcn.com code example
public class Address {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// Getters and setters
}
public class Person implements Cloneable {
private String name;
private int age;
private Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
public Object clone() throws CloneNotSupportedException {
Person clonedPerson = (Person) super.clone();
clonedPerson.address = (Address) address.clone();
return clonedPerson;
}
public static void main(String[] args) {
Address address = new Address("123 Main St", "City");
Person person1 = new Person("Alice", 30, address);
try {
Person person2 = (Person) person1.clone();
System.out.println(person2.getName()); // 输出 "Alice"
System.out.println(person2.getAge()); // 输出 30
System.out.println(person2.getAddress().getStreet()); // 输出 "123 Main St"
System.out.println(person2.getAddress().getCity()); // 输出 "City"
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
// Getters and setters
}在上面的示例中,Person 类包含一个 Address 类型的引用对象 address。在 clone() 方法中,我们首先调用 super.clone() 复制对象本身,然后再对 address 对象进行深度复制。
这就是 Java 中对象克隆的基本概念和实现方式。通过对象克隆,我们可以在不影响原始对象的情况下创建新的对象,从而方便地进行对象复制和传递。