http://www.blogjava.net/woxingwosu/archive/2008/01
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相关推荐
- 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx
自动投票器的原理及设计思路 ___________________________罗坤凡 2008-01-12 网络投票和平时浏览网页.登陆邮箱一样,都是客户端和网站服务器之间的通讯过程.客户端发出信 ...
- GDI+中发生一般性错误的解决办法 from http://www.cnblogs.com/winzheng/archive/2008/12/23/1360440.html...
GDI+中发生一般性错误的解决办法 这个错误经常发生,代码如下: private static byte[] GetBytes (Image image) { ...
- http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
- 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 ...
- IIS6.0应用程序池回收和工作进程【转:http://www.cnblogs.com/freshman0216/archive/2008/06/02/1212460.html】...
公司的一个网站程序长时间运行后,速度变慢,重新启动网站后速度明显变快,估计是网站程序占用的内存和CPU资源没能及时释放,才需要每隔一段时间重启网站释放资源.但手工重启总不能算解决问题的方法,怎样才能实 ...
- (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...
- http://www.blogjava.net/heyang/archive/2010/12/02/
2019独角兽企业重金招聘Python工程师标准>>> http://www.blogjava.net/heyang/archive/2010/12/02/339589.html 使 ...
- http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html
http://www.blogjava.net/beansoft/archive/2007/03/09/102812.html
- SQL Server 视图创建点滴 (转http://www.cnblogs.com/fineboy/archive/2008/05/10/236731.html#1191527)...
2008年6月22日 视图在数据库开发过程中是非常重要的,对提高查询速度有很大的提高.因此我们的学会创建视图,并且有效的使用视图. (1)表准的SQL视图 标准视图比较简单, ...
最新文章
- 多激光雷达与相机的外参快速精准标定(arxiv 2021)
- linux线程堆分配,如何在Linux中的相同进程下为线程分配堆栈或内存
- icse ccf_ICSE的完整形式是什么?
- SQL 字符 数字 转换字母
- ajax的data数据无意间的致命错误
- 【二叉树】美团的【天天领现金】活动,不就是 斐波那契 数列么?
- [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
- JeecgBoot框架学习
- 联想服务器光驱安装win7系统,联想光盘安装win7系统教程
- 5 个最好的免费开源反病毒工具(PC版)
- windows10系统平移到新的硬盘(修复引导区)
- 网络传输介质和常见的设备
- 使用total commander打开当前目录
- 金蝶物料辅助属性改造
- 海信JAVA开发笔试题_JAVA设计模式之【工厂方法模式】
- <OS Concepts> 1- Intro
- 全面解析电商数据挖掘之关联算法
- 从2014全球出版业50强排行榜看出版产业的格局演变
- 第三章数据链路层测试题
- 马斯克看好的赛道被中国企业率先交卷:研发投入超六成、不到3年营收超20亿,将成「人形机器人第一股」...