在实际的编程中可能会碰见需要克隆的地方,这里对假克隆和真克隆(浅克隆)做一个简单的记录和分析

假克隆的代码:

public class Employee {private String name;private int age;public String setName(String string){return this.name = string;};public int setAge(int A) {return this.age = A;};public String toString(){return"姓名:"+name+"年龄:"+age;};
}
public class Test {public static void main(String[] args){System.out.println("克隆之前");Employee employee1 = new Employee();employee1.setName("明日科技");employee1.setAge(12);System.out.println("员工1的信息");System.out.println(employee1);System.out.println("克隆之后");Employee employee2 = employee1;employee2.setName("西南交通大学");employee2.setAge(114);System.out.println("员工2的信息:");System.out.println(employee2);System.out.println("员工1的信息:");System.out.println(employee1);}
}

在这个代码中,其实我们想要对于员工一的信息进行克隆,然后产生员工二;

但是在最终的结果中没有真正的产生,如下图:

当我们对于employee2进行修改的时候,我们对于employee1也产生了修改。

则我们在对于第二次对于employee1调用的时候也会出现和employee2相同的情况。


浅克隆如下:

public class Test {public static void main(String[] args){System.out.println("克隆之前");Address address = new Address("中国","吉林","长春");Employee employee1 = new Employee("明日科技",12,address);System.out.println("员工1的信息");System.out.println(employee1);System.out.println("克隆之后");Employee employee2 = employee1.clone();employee2.getAddress().setState("中国");employee2.getAddress().setProvince("四川");employee2.getAddress().setCity("成都");employee2.setName("西安交通大学");employee2.setAge(114);System.out.println("员工2的信息:");System.out.println(employee2);System.out.println("员工1的信息:");System.out.println(employee1);}
}
public class Address {private String state;private String province;private String city;public Address(String state,String province,String city){this.state = state;this.province = province;this.city = city;}public String setState (String string){return this.state = string;};public String setProvince (String string){return this.province = string;};public String setCity (String string){return this.city = string;};public String toString(){StringBuilder sb = new StringBuilder();sb.append("国家:"+ state +",");sb.append("省" + province +",");sb.append("市" + city);return sb.toString();};
}
public class Employee implements Cloneable{private String name;private int age;private Address address;public Employee(String name,int age,Address address){this.name = name;this.age =age;this.address = address;}public String setName(String string){return this.name = string;};public int setAge(int A) {return this.age = A;};public String toString(){StringBuilder sb = new StringBuilder();sb.append("姓名:"+ name +",");sb.append("年龄:" + age +"\n");sb.append("地址:" + address);return sb.toString();};public Address getAddress(){return address;};public Employee clone(){Employee employee = null;try{employee =(Employee)super.clone();}catch (CloneNotSupportedException e){e.printStackTrace();}return employee;}
}

结果如下图:

可以明显的看出我们对于这个员工2的克隆改变其姓名和年龄,并未对其的原有的属性进行改变

而Address则依旧因为员工二的改变而改变。


总结:

一般来说,如果只包含基本类型和不可变的引用类型,如String,或者其在其的周期中不发生改变,则可以使用浅克隆。

但是,通常情况下不是如此简单,下个博客将介绍深克隆!

欢迎关注,提问。

Java的假克隆和真克隆(1)相关推荐

  1. java 如何实现对象克隆_Java对象克隆

    Java不提供克隆(复制)对象的自动机制.克隆对象意味着逐位复制对象的内容.要支持克隆操作,请在类中实现clone()方法.Object类中的clone()方法的声明如下: protected Obj ...

  2. java 子类克隆_Java对象克隆了解

    1.java接口中有一种空的接口叫标识接口,这种接口值起到标识作用. 2.要实现java对象克隆需要用到Object类的 protected Object clone() throws CloneNo ...

  3. java中实现对象的深度克隆

    1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...

  4. 链接克隆 完整克隆_深入克隆

    链接克隆 完整克隆 在继续克隆概念之前,让我们用对象创建概念刷新基础知识. 使用new运算符创建对象时,对象将在堆中获取内存分配. 堆中的对象创建 在Java中,理想情况下仅通过引用变量修改对象,即仅 ...

  5. 啥是对象的浅度克隆和深度克隆?

    在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...

  6. Cloneable接口的作用与深入理解深度克隆与浅度克隆

    cloneable接口的作用 cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则 ...

  7. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  8. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

最新文章

  1. “我,懂数据,不怕被裁”:这项核心能力到底有多香?
  2. 【刷题记录】杂题记录
  3. linux下远程登录如何退出,Ubuntu 中rdesktop如何切换和退出远程桌面
  4. 并发编程的目的和挑战
  5. Activity与Intent机制的学习笔记--转自feisky
  6. 阿里矢量图可根据样式修改颜色
  7. windows下桌面便签小工具简单使用技巧
  8. UVM中 sequence中的starting_phase
  9. vue前端项目基于淘宝lib-flexible做手机端适配
  10. 机器学习Python学习——逻辑斯蒂回归(Logistic Regression)
  11. 我国超级计算机型号,中国成功研制千万亿次超级计算机天河一号
  12. ctrl跳转失败 studio uap_uap进不去,重装studio和uap都不能行,请大神给看看
  13. Kerberos简介、安装及与其它服务的集成和使用
  14. DevExpress控件汉化类 z
  15. 量子计算机治愈癌症,如果量子计算机实现了,癌症可以治愈吗?
  16. 【训练题27:单调队列实现RMQ(附带详细说明)】 H :圣诞糖果 | 吉首大学第十届“新星杯”
  17. netty实现 socket demo
  18. 1455: 罗马游戏
  19. 【财务学习笔记】ROE和ROI的比较
  20. 关于 DevOps ,咱们聊的可能不是一回事

热门文章

  1. python:web后台框架简单实现
  2. 河北空气能热水器隆丰新能源科技有限公司石家庄超低温热泵
  3. SQLite 数据类型
  4. cimiss数据_气象现代化成果汛期应用系列报道_中国气象网
  5. 好用的iPhone手机第三方便签备忘录记事本
  6. api质量等级_关于机油的API等级
  7. 行动大于进球:评价足球运动员的行动价值(Actions Speak Louder than Goals: Valuing Player Actions in Soccer)
  8. 论文阅读9:在自适应辅导系统中保持和测量ZPD
  9. 3dmax拾取路径怎么用(3DMAX路径工具使用教程)
  10. CPU巨头英特尔盯上GPU会咋样?