JAVA中Clone方法的使用
2022/9/15 1:17:31
本文主要是介绍JAVA中Clone方法的使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考:https://www.cnblogs.com/Kevin-ZhangCG/p/9088619.html
影子克隆也就是浅克隆
浅克隆
package com.pillar.test.clone.demo02.shallowcopy; /** * @author Pillar * @version 1.0 * @date 2022/9/14 19:36 */ public class Teacher implements Cloneable { private String name; private Integer age; private Course course; public Teacher() { } public Teacher(String name, Integer age, Course course) { this.name = name; this.age = age; this.course = course; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } @Override protected Teacher clone() throws CloneNotSupportedException { return (Teacher) super.clone(); } @Override public String toString() { return "Teacher [name=" + name + ", age=" + age + ", course=" + course + "]"; } }
package com.pillar.test.clone.demo02.shallowcopy; public class Course { private String name; private Integer id; public Course() { } public Course(String name, Integer id) { this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "Course [name=" + name + ", id=" + id + "]"; } }
package com.pillar.test.clone.demo02.shallowcopy; /** * @author Pillar * @version 1.0 * @date 2022/9/14 19:16 */ /* 影子克隆 调用clone方法产生的效果是:现在内存中开辟一块和原始对象一样的空间,然后拷贝原始对象中的内容 但对于非基本类型,它们保存的仅仅是对象的引用 为了解决影子克隆所产生的问题,我们就需要使用深度克隆方案。 */ public class TestClone { public static void main(String[] args) { Teacher teacher1 = new Teacher("zhangsan",18,new Course("语文",1)); System.out.println("teacher1 ->" + teacher1); try { Teacher teacher2 = teacher1.clone(); System.out.println("course是否相同: "+teacher1.getCourse().equals(teacher2.getCourse())); System.out.println("teacher2 ->" + teacher2); System.out.println(teacher1.equals(teacher2)); System.out.println("Alter teacher2......"); teacher2.setName("Lisi"); teacher2.setAge(20); teacher2.getCourse().setName("English"); teacher2.getCourse().setId(88); System.out.println("teacher1=>"+teacher1); System.out.println("teacher2=>"+teacher2); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
深拷贝
package com.pillar.test.clone.demo02.deepcopy; /** * @author Pillar * @version 1.0 * @date 2022/9/14 19:36 */ public class Teacher implements Cloneable { private String name; private Integer age; private Course course; public Teacher() { } public Teacher(String name, Integer age, Course course) { this.name = name; this.age = age; this.course = course; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } @Override protected Object clone() throws CloneNotSupportedException { Teacher teacher = (Teacher)super.clone(); teacher.course = course.clone(); return teacher; } @Override public String toString() { return "Teacher [name=" + name + ", age=" + age + ", course=" + course + "]"; } }
package com.pillar.test.clone.demo02.deepcopy; public class Course implements Cloneable{ private String name; private Integer id; public Course() { } public Course(String name, Integer id) { this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override protected Course clone() throws CloneNotSupportedException { return (Course) super.clone(); } @Override public String toString() { return "Course [name=" + name + ", id=" + id + "]"; } }
package com.pillar.test.clone.demo02.deepcopy; /** * 测试clone方法 * @author Kevin * */ public class TestClone { public static void main(String[] args){ Teacher t1 = new Teacher(); t1.setName("Kevin"); t1.setAge(22); Course c1 = new Course(); c1.setName("Math"); c1.setId(66); t1.setCourse(c1); System.out.println("teacher1"+t1); try{ Teacher t2 = (Teacher) t1.clone(); System.out.println("Clone teacher2 from teacher1..."); System.out.println("teacher2"+t2); System.out.println("Alter teacher2..."); t2.setName("Ryan"); t2.setAge(18); //修改courese属性 t2.getCourse().setName("English"); t2.getCourse().setId(88); System.out.println("teacher1"+t1); System.out.println("teacher2"+t2); }catch(CloneNotSupportedException e){ e.printStackTrace(); } } }
浅拷贝拷贝了对象本身,但对于非基本类型,指向同一引用地址;
深拷贝拷贝了对象本身,也拷贝了引用对象
这篇关于JAVA中Clone方法的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27数据结构与算法面试题详解及练习
- 2024-12-27网络请求面试题详解与实战
- 2024-12-27数据结构和算法面试真题详解与实战教程
- 2024-12-27网络请求面试真题解析与实战教程
- 2024-12-27数据结构和算法大厂面试真题详解与实战指南
- 2024-12-27TS大厂面试真题解析与应对策略
- 2024-12-27TS大厂面试真题详解与解析
- 2024-12-27网站安全入门:如何识别和修复漏洞
- 2024-12-27SQL注入基础教程
- 2024-12-27初学者指南:理解和修复跨域漏洞