您的位置:首页 > 新闻 > 热点要闻 > 写 clone()方法时,通常都有一行代码,是什么?

写 clone()方法时,通常都有一行代码,是什么?

2025/6/8 9:04:59 来源:https://blog.csdn.net/m0_70154470/article/details/139781856  浏览:    关键词:写 clone()方法时,通常都有一行代码,是什么?

在 Java 中,当你实现 clone() 方法时,通常会调用 super.clone() 来确保正确地复制对象。super.clone() 调用 Object 类的 clone() 方法,这个方法进行的是浅复制,它复制对象中的所有字段,包括基本类型和对象引用,但不复制引用对象本身。以下是 clone() 方法实现的详细说明和示例代码。

  1. 实现 Cloneable 接口:类必须实现 Cloneable 接口,否则 super.clone() 会抛出 CloneNotSupportedException 异常。
  2. 调用 super.clone():确保父类的字段也被正确复制。
  3. 处理 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();}}
}

说明

  1. 实现 Cloneable 接口Person 类和 Address 类都实现了 Cloneable 接口。
  2. 调用 super.clone():在 PersonAddress 类的 clone() 方法中,调用了 super.clone() 以执行默认的浅复制。
  3. 深复制:在 Person 类中,我们手动克隆了 address 字段,这是一种深复制的实现方式,以确保 Person 对象的 address 字段是一个新的对象,而不是引用原对象的 address 字段。

在这个示例中,通过修改 person1 的地址字段,可以看到 person2 的地址字段并未受到影响,说明 address 字段已经被深复制。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com