一、为什么要克隆?

答案是:克隆的对象可能包含一些已经修改过的属性,保留着你想克隆对象的值,而new出来的对象的属性全是一个新的对象,对应的属性没有值,所以我们还要重新给这个对象赋值。即当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。

二、如何实现克隆

分三步:

  1. 对象的类实现Cloneable接口;
  2. 覆盖Object类的clone()方法 (覆盖clone()方法,访问修饰符设为public,默认是protected);
  3. 在clone()方法中调用super.clone();

三、两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。

浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。

深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:

浅克隆

package cn.zhm.day4;public class Student implements Cloneable {private int age;private String name;public Student(int age, String name) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name + "]";}@Overridepublic Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubreturn super.clone();}/*** @param args* @throws CloneNotSupportedException*/public static void main(String[] args) throws CloneNotSupportedException {Student student1 = new Student(20, "张三");Student student2 = (Student) student1.clone();student2.setAge(22);// 注意修改student2的age值 但是没有影响 student1的值System.out.println("student1:" + student1.getName() + "-->"+ student1.getAge());System.out.println("student2:" + student2.getName() + "-->"+ student2.getAge());}
}
运行结果:
student1:张三-->20
student2:张三-->22 

引入深克隆,浅入克隆导致的问题

package cn.zhm.day4;class Teacher implements Cloneable {private String name;private Student student;public String getName() {return name;}public void setName(String name) {this.name = name;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overridepublic String toString() {return "Teacher [name=" + name + ", student=" + student + "]";}@Overridepublic Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubreturn super.clone();}public static void main(String[] args) throws CloneNotSupportedException {Student s1 = new Student();s1.setAge(20);s1.setName("张三");Teacher teacher1 = new Teacher();teacher1.setName("小赵老师");teacher1.setStudent(s1);//为什么会出现以下结果, Teacher中的clone方法Teacher teacher2 = (Teacher)teacher1.clone();Student s2 = teacher2.getStudent();s2.setName("李四");s2.setAge(30);System.out.println("teacher1:"+teacher1);System.out.println("teacher2:"+teacher2);}}

运行结果:

teacher1:Teacher [name=小赵老师, student=Student [age=30, name=李四]]
teacher2:Teacher [name=小赵老师, student=Student [age=30, name=李四]

深克隆

要克隆的类和类中所有非基本数据类型的属性对应的类

必需在clone()方法注意点

package cn.zhm.day4;class Teacher implements Cloneable {private String name;private Student student;public String getName() {return name;}public void setName(String name) {this.name = name;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overridepublic String toString() {return "Teacher [name=" + name + ", student=" + student + "]";}@Overridepublic Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stub//注意以下代码Teacher teacher = (Teacher)super.clone();teacher.setStudent((Student)teacher.getStudent().clone());return teacher;}public static void main(String[] args) throws CloneNotSupportedException {Student s1 = new Student();s1.setAge(20);s1.setName("张三");Teacher teacher1 = new Teacher();teacher1.setName("小赵老师");teacher1.setStudent(s1);Teacher teacher2 = (Teacher)teacher1.clone();teacher2.setName("小明老师");Student s2 = teacher2.getStudent();s2.setName("李四");s2.setAge(30);System.out.println("teacher1:"+teacher1);System.out.println("teacher2:"+teacher2);}}

运行结果:

teacher1:Teacher [name=小赵老师, student=Student [age=20, name=张三]]

teacher2:Teacher [name=小明老师, student=Student [age=30, name=李四]]

好好理解上面代码一定可以掌握 浅克隆(ShallowClone)和深克隆(DeepClone)。

彻底理解Java深克隆和浅克隆的原理及实现相关推荐

  1. Java深克隆和浅克隆的原理及实现

    Java中没有C++中所谓的拷贝构造函数,但是相应地提供了Cloneable接口.在Java中所有类都实现了clone()方法,因为Java中的所有类的父类Object具有clone()方法,而所有J ...

  2. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  3. 深入理解Java并发之synchronized实现原理

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian ...

  4. 理解Java的OCP和IOC原理

    7七月demand 1. 要自己理解 1. 不能照搬 1. 不能和Spring相同 1. 为什么 ​ 目的: 理解Java的OCP和IOC原理 作业要求: 课程从一个非常简单的案例逐步讲解Java为什 ...

  5. Java中的深克隆和浅克隆的原理及三种方式实现深克隆

      本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...

  6. 浅浅理解一下深克隆和浅克隆

    一.深克隆:基本数据类型的赋值 进行深克隆的是八大基本数据类型(byte,short,int,long,float,double,char,boolean) 大白话理解一下:就是指将数据拷贝后两者无关 ...

  7. Java深克隆和浅克隆

    一.为什么要克隆? 使用场景: 当使用一个对象的属性时,需要进行一些修改,但是又不能直接修改该对象,此时我们就可以使用克隆来拷贝一个对象,进行操作.不然就需要new一个对象,对属性赋值. 总的来说为了 ...

  8. 理解Java和C语言编译原理

    C语言代码的编译原理: http://blog.csdn.net/neil_wesley/article/details/51265457 Java语言的编译原理: http://www.cnblog ...

  9. 深入理解Java中的底层阻塞原理及实现

    谈到阻塞,相信大家都不会陌生了.阻塞的应用场景真的多得不要不要的,比如 生产-消费模式,限流统计等等.什么 ArrayBlockingQueue. LinkedBlockingQueue.DelayQ ...

最新文章

  1. 下一代脑电图可以帮助恢复失去的大脑功能
  2. ESP8266 WiFi串口模块的学习与使用(一)
  3. 深入学习consul
  4. java 相对路径 文件读取,Java相对路径读取文件
  5. android contentprovider api,Content Provider Basics
  6. Python判断变量是否存在的方法
  7. plsql视图添加表字段_Oracle-单表多字段查询(不使用*)
  8. Python使用wordnet工具计算词集与词条基本用法(三)
  9. 2019胡润全球富豪榜发布:最有钱的华人还是他!
  10. Eclipse快捷键(转载)
  11. 等高线生成地形_等高线一键变地形模型
  12. 如何查看局域网络计算机资料,怎么查看局域网内所有电脑的信息
  13. 平衡小车从原理到实践
  14. Linux实验四:文件的压缩
  15. spss进行相关性分析
  16. 园区人工智能开启双创模式,“1+N”创新型组织发展成效初显
  17. windows7系统,ping本机ip地址请求超时的解决方案
  18. python 换国内源
  19. 中央电大 c语言程序设计a 试题,中央电大2008年秋C语言程序设计A试题5
  20. HTML学习(二):HTML基础

热门文章

  1. tomcat配置缓存溢出异常
  2. 前端button一键预览与下载
  3. 电脑如何打出声调的五度竖棍标记法符号 ?
  4. 计算机主机无法开机故障原因,电脑按开机键没反应的主要原因?
  5. 尚硅谷Java数据结构与算法——054 冒泡排序
  6. textrank提取关键词与关键句
  7. MWC世界移动通信大会
  8. photoshop学习之路--------自定义画笔预设与图像动态效果的制作(gif格式输出)
  9. 照片编辑怎么做?别担心,我有好用方法
  10. c语言declspec,c++ error LNK2001: 无法解析的外部符号 __declspec(dllimport)