快速业务通道

浅析Java的“克隆”方法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ble接口,重载clone()方法)。二是在CloneB的clone()方法中加入一句o.unCA = (UnCloneA)unCA.clone();

程序如下:

package clone.ext; class UnCloneA implements Cloneable{  private int i;  public UnCloneA(int ii) { i = ii; }  public void doublevalue() { i *= 2; }  public String toString() {  return Integer.toString(i); } public Object clone(){  UnCloneA o = null;  try{   o = (UnCloneA)super.clone();  }catch(CloneNotSupportedException e){   e.printStackTrace();  }  return o; } } class CloneB implements Cloneable{  public int aInt;  public UnCloneA unCA = new UnCloneA(111);  public Object clone(){   CloneB o = null;   try{    o = (CloneB)super.clone();   }catch(CloneNotSupportedException e){    e.printStackTrace();   }   o.unCA = (UnCloneA)unCA.clone();   return o;  } } public class CloneMain {  public static void main(String[] a){   CloneB b1 = new CloneB();   b1.aInt = 11;   System.out.println("before clone,b1.aInt = "+ b1.aInt);   System.out.println("before clone,b1.unCA = "+ b1.unCA);   CloneB b2 = (CloneB)b1.clone();   b2.aInt = 22;   b2.unCA.doublevalue();   System.out.println("=================================");   System.out.println("after clone,b1.aInt = "+ b1.aInt);   System.out.println("after clone,b1.unCA = "+ b1.unCA);   System.out.println("=================================");   System.out.println("after clone,b2.aInt = "+ b2.aInt);   System.out.println("after clone,b2.unCA = "+ b2.unCA);  } } /** RUN RESULT: before clone,b1.aInt = 11 before clone,b1.unCA = 111 ================================= after clone,b1.aInt = 11 after clone,b1.unCA = 111 ================================= after clone,b2.aInt = 22 after clone,b2.unCA = 222 */

可以看出,现在b2.unCA的改变对b1.unCA没有产生影响。此时b1.unCA与b2.unCA指向了两个不同的UnCloneA实例,而且在CloneB b2 = (CloneB)b1.clone();调用的那一刻b1和b2拥有相同的值,在这里,b1.i = b2.i = 11。

要知道不是所有的类都能实现深度clone的。例如,如果把上面的CloneB类中的UnCloneA类型变量改成StringBuffer类型,看一下JDK API中关于StringBuffer的说明,StringBuffer没有重载clone()方法,更为严重的是StringBuffer还是一个final类,这也是说我们也不能用继承的办法间接实现StringBuffer的clone。如果一个类中包含有StringBuffer类型对象或和StringBuffer相似类的对象,我们有两种选择:要么只能实现影子clone,要么就在类的clone()方法中加一句(假设是SringBuffer对象,而且变量名仍是unCA): o.unCA = new StringBuffer(unCA.toString()); //原来的是:o.unCA = (UnCloneA)unCA.clone();

还要知道的是除了基本数据类型能自动实现深度clone以外,String对象是一个例外,它clone后的表现好象也实现了深度clone,虽然这只是一个假象,但却大大方便了我们的编程。

浅析Java的“克隆”方法(6)

时间:2010-09-28

Clone中String和StringBuffer的区别

应该说明的是,这里不是着重说明String和StringBuffer的区别,但从这个例子里也能看出String类的一些与众不同的地方。

下面的例子中包括两个类,CloneC类包含一个String类型变量和一个StringBuffer类型变量,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号