Java克隆Clone
☆什么是Clone Clone就是得到一个对象x的副本,而且x.clone() != x。Clone分为两种:浅度克隆Shallow Clone和浅度克隆Deep Clone

Object类有clone()方法: protected native Object clone() throws CloneNotSupportedException; 但是Object本身没有implements Cloneable,在执行clone方法时,先检查this.getClass()是否实现了cloneable接口,如果没有实现Cloneable接口,clone()就会抛CloneNotSupportedException返回。否则就会创建一个新的this.getClass()的对象other,并将this每一个field的值赋值给other的对应field,然后返回other。

接口Cloneable起一个标志作用(和Serializable类似),用来标志该类具有克隆功能。

☆实现Shallow clone Shallow Clone只是将基本类型赋值过去,对于对象传的是引用。(String对于比较特别,[一般内容一样则引用一样,轻量级模式])Shallow Clone
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian");
System.out.println("area:"+area);
Area areaClone=area.clone();
System.out.println("areaClone:"+areaClone);
System.out.println("area==areaClone:"+(area==areaClone));
System.out.println("area.getClass()==areaClone.getClass():"+(area.getClass()==areaClone.getClass()));
area.province="jiangxi";
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Area(String province){
this.province=province;
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province;
}
}输出结果
area: province=fujian
areaClone: province=fujian
area==areaClone:false
area.getClass()==areaClone.getClass():true
area: province=jiangxi
areaClone: province=fujian

☆Shallow Clone的问题 因为对于对象只是拷贝引用,所有就会造成this对其中对象的修改引起other中相应对象的修改,例子如下:Shallow Clone问题
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian","fujian info");
Area areaClone=area.clone();
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
area.province="jiangxi";
area.info.name="new info";
System.out.println("--------After Change-------");
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Info info;
Area(String province,String infoName){
this.province=province;
info=new Info(infoName);
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province+"\t info="+info.name;
}
}

class Info{
String name;
Info(String name){
this.name=name;
}
}输出结果
area: province=fujian info=fujian info
areaClone: province=fujian info=fujian info
--------After Change-------
area: province=jiangxi info=new info
areaClone: province=fujian info=new info

☆Deep Clone 有些时候我们不希望this与other之间的修改相互影响,这时就应该用深度克隆。对所有涉及到的对象也实现Clone。Deep Clone
public class Test {
public static void main(String[] args) throws Exception{
Area area=new Area("fujian","fujian info");
Area areaClone=area.clone();
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
area.province="jiangxi";
area.info.name="new info";
System.out.println("--------After Change-------");
System.out.println("area:"+area);
System.out.println("areaClone:"+areaClone);
}
}

class Area implements Cloneable{
String province;
Info info;
Area(String province,String infoName){
this.province=province;
info=new Info(infoName);
}

@Override
public Area clone(){
Area area=null;
try{
area=(Area)super.clone();
area.info=this.info.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return area;
}

@Override
public String toString(){
return "\tprovince="+province+"\t info="+info.name;
}
}

class Info implements Cloneable{
String name;
Info(String name){
this.name=name;
}
@Override
public Info clone(){
Info info=null;
try{
info=(Info)super.clone();
}catch(CloneNotSupportedException cnse){
cnse.printStackTrace();
}
return info;
}
}输出结果
area: province=fujian info=fujian info
areaClone: province=fujian info=fujian info
--------After Change-------
area: province=jiangxi info=new info
areaClone: province=fujian info=fujian info

☆参考:
http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html
http://www.blogjava.net/junky/archive/2007/05/08/115928.html

http://www.blogjava.net/woxingwosu/archive/2008/01相关推荐

  1. 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx

    自动投票器的原理及设计思路 ___________________________罗坤凡 2008-01-12 网络投票和平时浏览网页.登陆邮箱一样,都是客户端和网站服务器之间的通讯过程.客户端发出信 ...

  2. GDI+中发生一般性错误的解决办法 from http://www.cnblogs.com/winzheng/archive/2008/12/23/1360440.html...

    GDI+中发生一般性错误的解决办法 这个错误经常发生,代码如下:    private  static  byte[] GetBytes (Image image)         {         ...

  3. http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html

    http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html

  4. http://www.cnblogs.com/Bear-Study-Hard/archive/2008/03/26/1123267.html

    http://www.cnblogs.com/Bear-Study-Hard/archive/2008/03/26/1123267.html 转载于:https://www.cnblogs.com/m ...

  5. IIS6.0应用程序池回收和工作进程【转:http://www.cnblogs.com/freshman0216/archive/2008/06/02/1212460.html】...

    公司的一个网站程序长时间运行后,速度变慢,重新启动网站后速度明显变快,估计是网站程序占用的内存和CPU资源没能及时释放,才需要每隔一段时间重启网站释放资源.但手工重启总不能算解决问题的方法,怎样才能实 ...

  6. (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出

    (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...

  7. http://www.blogjava.net/heyang/archive/2010/12/02/

    2019独角兽企业重金招聘Python工程师标准>>> http://www.blogjava.net/heyang/archive/2010/12/02/339589.html 使 ...

  8. http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html

    http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html

  9. SQL Server 视图创建点滴 (转http://www.cnblogs.com/fineboy/archive/2008/05/10/236731.html#1191527)...

    2008年6月22日      视图在数据库开发过程中是非常重要的,对提高查询速度有很大的提高.因此我们的学会创建视图,并且有效的使用视图. (1)表准的SQL视图         标准视图比较简单, ...

最新文章

  1. 多激光雷达与相机的外参快速精准标定(arxiv 2021)
  2. linux线程堆分配,如何在Linux中的相同进程下为线程分配堆栈或内存
  3. icse ccf_ICSE的完整形式是什么?
  4. SQL 字符 数字 转换字母
  5. ajax的data数据无意间的致命错误
  6. 【二叉树】美团的【天天领现金】活动,不就是 斐波那契 数列么?
  7. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  8. JeecgBoot框架学习
  9. 联想服务器光驱安装win7系统,联想光盘安装win7系统教程
  10. 5 个最好的免费开源反病毒工具(PC版)
  11. windows10系统平移到新的硬盘(修复引导区)
  12. 网络传输介质和常见的设备
  13. 使用total commander打开当前目录
  14. 金蝶物料辅助属性改造
  15. 海信JAVA开发笔试题_JAVA设计模式之【工厂方法模式】
  16. <OS Concepts> 1- Intro
  17. 全面解析电商数据挖掘之关联算法
  18. 从2014全球出版业50强排行榜看出版产业的格局演变
  19. 第三章数据链路层测试题
  20. 马斯克看好的赛道被中国企业率先交卷:研发投入超六成、不到3年营收超20亿,将成「人形机器人第一股」...

热门文章

  1. Spring Boot中的多事务管理
  2. java中aop和aoc的区别_法国AOC、AOP、VDP和IGP葡萄酒有什么区别?
  3. Centos7下Samba服务器配置
  4. 中央空调组空、风柜变频pid控制实例
  5. npm更新依赖包到最新版本
  6. 地下水数值模拟Visual modflow Flex实例讲解
  7. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
  8. 巧用零存整取提高利息收益
  9. 利用face_recognition进行人脸识别,从全班证件照中找出自己
  10. 华为服务器查看系统版本,服务器操作系统版本查看命令