欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()

发布时间:2025/3/19 java 59 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone() 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. 浅克隆实现

public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Student s = new Student(18, new String("lhj"), new Hobby("ping-pang"));Student s1 = s.clone();System.out.println(s);System.out.println(s1);s1.age = 19;s1.name = new String("lkj");s1.hobby.hobby1 = new String("basketball");System.out.println("修改后========");System.out.println(s);System.out.println(s1);} }// 实现Cloneable接口 class Student implements Cloneable{int age;String name;Hobby hobby;Student(int age, String name, Hobby hobby){this.age = age;this.name = name;this.hobby = hobby;}@Overridepublic Student clone() throws CloneNotSupportedException {return (Student) super.clone(); // 调用父类的clone方法,直至调用Object.clone()方法实现对象的复制}@Overridepublic String toString() {return "Student{" + "age=" + age + ", name='" + name + '\'' + ", hobby=" + hobby + '}';} }class Hobby{String hobby1;Hobby(String hobby){this.hobby1 = hobby;}@Overridepublic String toString() {return "Hobby{" + "hobby1='" + hobby1 + '\'' + '}';} }

 

2. 深克隆实现

public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Student s = new Student(18, new String("lhj"), new Hobby("ping-pang"));Student s1 = s.clone();System.out.println(s);System.out.println(s1);s1.age = 19;s1.name = new String("lkj");s1.hobby.hobby1 = new String("basketball");System.out.println("修改后========");System.out.println(s);System.out.println(s1);} }class Student implements Cloneable{int age;String name;Hobby hobby;Student(int age, String name, Hobby hobby){this.age = age;this.name = name;this.hobby = hobby;}/*** 改写的clone方法*/@Overridepublic Student clone() throws CloneNotSupportedException{Student tmp = (Student) super.clone();tmp.hobby = hobby.clone();return tmp;}@Overridepublic String toString() {return "Student{" + "age=" + age + ", name='" + name + '\'' + ", hobby=" + hobby + '}';} }class Hobby implements Cloneable{String hobby1;Hobby(String hobby){this.hobby1 = hobby;}/*** 新增加的clone方法*/@Overridepublic Hobby clone() throws CloneNotSupportedException {return (Hobby) super.clone();}@Overridepublic String toString() {return "Hobby{" + "hobby1='" + hobby1 + '\'' + '}';} }

 

3. 浅克隆和深克隆的区别

3.1 浅克隆:克隆后,修改克隆对象或原对象的基本类型和String类型属性,不会影响另一个对象,但是修改其它引用类型属性,则会影响另一个对象。深克隆:克隆后,克隆对象和原对象之间没有关联,修改某个对象不会影响另一个对象。

3.2 浅克隆的String类型属性之所以不受另一个对象的改变而影响,是因为String类型是不可修改的,也就无法操作,也就不会受到另一个对象操作的影响。

3.3 浅克隆的引用类型属性会受到另一个对象的改变而影响,是因为它们共用一个引用对象,那么引用对象更改,会影响另一个对象,所以我们在克隆时,需要把引用类型属性也克隆一份,这样就不会互相干扰,最终实现深克隆。

总结

以上是生活随笔为你收集整理的Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。