在 Java 中,当你实现 clone() 方法时,通常会调用 super.clone() 来确保正确地复制对象。super.clone() 调用 Object 类的 clone() 方法,这个方法进行的是浅复制,它复制对象中的所有字段,包括基本类型和对象引用,但不复制引用对象本身。以下是 clone() 方法实现的详细说明和示例代码。
- 实现
Cloneable接口:类必须实现Cloneable接口,否则super.clone()会抛出CloneNotSupportedException异常。 - 调用
super.clone():确保父类的字段也被正确复制。 - 处理
CloneNotSupportedException异常:需要捕获和处理这个异常。
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;}@Overrideprotected Object clone() throws CloneNotSupportedException {// 调用 super.clone() 进行浅复制Person cloned = (Person) super.clone();// 深复制:如果成员变量是对象且需要深复制,需手动克隆这些对象cloned.address = (Address) this.address.clone();return cloned;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + ", address=" + address + '}';}
}class Address implements Cloneable {private String city;private String street;public Address(String city, String street) {this.city = city;this.street = street;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "Address{city='" + city + "', street='" + street + "'}";}
}public class Main {public static void main(String[] args) {try {Address address = new Address("New York", "5th Avenue");Person person1 = new Person("John Doe", 30, address);Person person2 = (Person) person1.clone();// 修改原始对象的地址person1.address.street = "Broadway";System.out.println(person1);System.out.println(person2);} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
说明
- 实现
Cloneable接口:Person类和Address类都实现了Cloneable接口。 - 调用
super.clone():在Person和Address类的clone()方法中,调用了super.clone()以执行默认的浅复制。 - 深复制:在
Person类中,我们手动克隆了address字段,这是一种深复制的实现方式,以确保Person对象的address字段是一个新的对象,而不是引用原对象的address字段。
在这个示例中,通过修改 person1 的地址字段,可以看到 person2 的地址字段并未受到影响,说明 address 字段已经被深复制。
