克隆

1、简介

在Java中对象的克隆有深克隆和浅克隆之分。有这种区分的原因是Java中分为基本数据类型和引用数据类型,对于不同的数据类型在内存中的存储的区域是不同的。基本数据类型存储在栈中,引用数据类型存储在堆中。

什么是克隆

克隆就是依据已经有的数据,创造一份新的完全一样的数据拷贝。

实现克隆有多种方式,可以手工的new出一个新的对象,然后将原来的对象信息一个一个的set到新的对象中。还有就是使用clone方法。使用clone方法必须满足:

  1. 实现Cloneable接口
  2. 使用public访问修饰符重新定义clone方法。

2、浅克隆与深克隆的区别

1、浅克隆:对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性(拷贝一份该对象并重新分配内存,即产生了新的对象);但如果被克隆的对象中包含除8中数据类型和String类型外的其他类型的属性,浅克隆并不会克隆这些属性(即不会为这些属性分配内存,而是引用原来对象中的属性)
2、深克隆:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

3、浅克隆与深克隆的特点

1、被克隆的对象的类应实现 Cloneable 接口,并重写 clone() 方法
2、浅克隆中由于除8中数据类型和String类型外的其他类型的属性不会被克隆,因此当通过新对象对这些属性进行修改时,原对象的属性也会同时改变。而深克隆则已经对这些属性重新分配内存,所以当通过新对象对这些属性进行修改时,原对象的属性不会改变。

4、浅克隆和深克隆代码对比

  1. 浅克隆
  • 创建Student类
public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return Student.class.getName() + "{" +"name='" + name + '\'' +", age=" + age +'}';}
}
  • 创建被克隆对象
public class Citation implements Cloneable {// 引用对象和String字符串private Student student;private String username;public void setUsername(String username) {this.username = username;}public String getUsername() {return username;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overrideprotected Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show() {System.out.println(username);System.out.println(student.getName() + "----" + student.getAge());}
}
  • 创建主函数测试
/*** @author GYL* 浅克隆* 引用对象的引用是一个,所以后面的修改会覆盖前面的*/
public class Client {public static void main(String[] args) throws CloneNotSupportedException {// citationCitation citation = new Citation();Student stu = new Student();stu.setName("张三");stu.setAge(18);citation.setStudent(stu);citation.setUsername("张三");// cloneCitation clone = citation.clone();clone.getStudent().setName("李四");clone.getStudent().setAge(19);clone.setUsername("李四");// show()citation.show();clone.show();}
}
  • 结果展示
张三
李四----19
李四
李四----19
  1. 深克隆(这里使用克隆嵌套的方式实现)
  • 创建Student类,实现了Clone接口
public class Student implements Cloneable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return Student.class.getName() + "{" +"name='" + name + '\'' +", age=" + age +'}';}@Overrideprotected Student clone() throws CloneNotSupportedException {return (Student) super.clone();}
}
  • 创建被克隆类
public class Citation implements Cloneable {private Student student;private String username;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overrideprotected Citation clone() throws CloneNotSupportedException {Citation citation = (Citation) super.clone();citation.student = student.clone();return citation;}public void show() {System.out.println(username);System.out.println(student.getName() + "----" + student.getAge());}
}
  • 创建主函数测试
/*** @author GYL* 深克隆* 使用克隆嵌套的方式进行克隆*/
public class Client {public static void main(String[] args) throws Exception {// citationCitation citation = new Citation();Student stu = new Student();stu.setName("张三");stu.setAge(18);citation.setStudent(stu);citation.setUsername("张三");// cloneCitation clone = citation.clone();clone.getStudent().setName("李四");clone.getStudent().setAge(19);clone.setUsername("李四");// show()citation.show();clone.show();}
}
  • 结果展示
张三
张三----18
李四
李四----19

6、总结

1.浅克隆:只复制基本类型的数据,引用类型的数据只复制了引用的地址,引用的对象并没有复制,在新的对象中修改引用类型的数据会影响原对象中的引用。
2.深克隆:是在引用类型的类中也实现了clone,是clone的嵌套,复制后的对象与原对象之间完全不会影响。
3.使用序列化也能完成深复制的功能:对象序列化后写入流中,此时也就不存在引用什么的概念了,再从流中读取,生成新的对象,新对象和原对象之间也是完全互不影响的。
4.使用clone实现的深克隆其实是浅克隆中嵌套了浅克隆,与toString方法类似

深克隆和浅克隆的区别相关推荐

  1. 深克隆与浅克隆的区别

    深克隆与浅克隆之间的区别 深克隆:用递归复制了对象的所有层级 浅克隆:浅复制只复制一层对象的属性 浅克隆 浅克隆是指在克隆对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进 ...

  2. java clone() 方法详解及深克隆与浅克隆

    概述 clone 翻译过来就是 克隆,顾名思义就是创造一个一模一样的事物.Java 代码中 clone() 方法是 Object 方法,而 Object 又是所有类的父类,也就是说所有 java 对象 ...

  3. vue数组的深克隆和浅克隆

    在开发过程中,前端获取到后端的数据之后,通常直接复制后就使用,比如: var _data = res.data; //浅克隆 data是一个数组 这就是浅克隆的写法,因为后端返回的data是一个数组, ...

  4. 深克隆和浅克隆有什么区别?它的实现方式有哪些?

    浅克隆(Shadow Clone) 是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对 ...

  5. JS 中的 assign 方法究竟是 “深克隆” 还是 “浅克隆”?

    先说一下答案:assign做的是浅克隆. "第一层是深克隆,下面的每一层做的是浅克隆" 这种说法其实是错误的.    在我们去探究assign是深克隆还是浅克隆之前,我们必须先明白 ...

  6. 我不知道的事——深克隆和浅克隆

    推荐一部好电影<致命魔术>.(此处为植入广告)        推荐理由:涉及人性.画面不错,剧情跌宕,亦魔亦幻(此处的"魔"为魔术的"魔").虽然女 ...

  7. Javascript深克隆和浅克隆

    深克隆和浅克隆 浅克隆:只需要拷贝对象中的原始类型值,引用类型拷贝的仍然是地址 深克隆:无论是原始类型还是引用类型都会进行拷贝,包括引用类型中还有其他引用类型的质. <script>let ...

  8. 浅析Java中的深克隆和浅克隆

    说实话,目前为止还没在项目中遇到过关于Java深克隆和浅克隆的场景.今天手抖戳开了花呗账单,双十二败家的战绩真是惨不忍睹,若能在我的客户端"篡改"下账单金额,那该(简)有(止)多( ...

  9. 原型模式以及深克隆和浅克隆

    原型模式的好处 创建比较复杂的对象,无需考虑过程,简化了创建对象的创建过程,同时也能提 高效率 原型模式分为浅克隆和深克隆,不同点 以我目前的理解:深克隆和浅克隆对于我们对象内的引用对象的克隆不一样 ...

最新文章

  1. 媒体查询 屏幕超过页面上版心的宽度时 ,(也就是所有内容能显示出来),不让它有滚动条 【解决了因为banner图的原因出现滚动条的问题】...
  2. 模拟实现mapset
  3. ps -ef grep java解释,ps -ef | grep java(示例代码)
  4. 5193. 删除字符使字符串变好
  5. 定义一个结构体指针需要分配存储空间?
  6. python运行命令_Python中执行外部命令
  7. JavaSE----多态
  8. 如果你没去 GDD,那可真是一种遗憾!
  9. 继CDH收费之后,这家公司率先推出了免费版大数据套件服务!
  10. LBP特征原理及代码实现
  11. 哔哩哔哩手机缓存的m4s音频和视频文件电脑观看?
  12. u盘中毒如何删除system volume information文件
  13. Verilog实现四位加/减法器(逻辑表达式)
  14. leetcode每日一题27
  15. UE4在Android平台调试
  16. python作为最热门的编程语言你知道多少?
  17. MySQL的基础学习(四)
  18. int a[ ]={0};
  19. 一天一篇latex刘海洋代码解析:1.2.5 遭遇数学公式
  20. 互联汽车:数字化正在颠覆汽车行业

热门文章

  1. 科研如何找到一个领域的痛点_另一种家:我如何找到自己的社区和在科技领域的地位...
  2. 2021-2027全球与中国镍钛合金医疗器械市场现状及未来发展趋势
  3. Windows环境下PyTorch_geometric安装踩坑
  4. 重读GPDB 和 TiDB 论文引发的 HTAP 数据库再思考
  5. 1.cpt介绍与思科设备的基本配置
  6. ctf题库--1000
  7. django连接mysql数据库_Django学习笔记(4)——Django连接数据库
  8. Velodyne CEO离职背后:风光不再,频频内斗,激光雷达巨头面临内忧外患
  9. 大二学计算机专业职业规划,大学生计算机专业职业生涯规划2000字
  10. pdf怎么转换成jpg或png图片?