快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
并且实现了clone()方法。在StrClone类中声明了CloneC类型变量c1,然后调用c1的clone()方法生成c1的拷贝c2,在对c2中的String和StringBuffer类型变量用相应的方法改动之后打印结果:

package clone; class CloneC implements Cloneable{  public String str;  public StringBuffer strBuff;  public Object clone(){   CloneC o = null;   try{    o = (CloneC)super.clone();   }catch(CloneNotSupportedException e){    e.printStackTrace();   }   return o;  } } public class StrClone {  public static void main(String[] a){   CloneC c1 = new CloneC();   c1.str = new String("initializeStr");   c1.strBuff = new StringBuffer("initializeStrBuff");   System.out.println("before clone,c1.str = "+ c1.str);   System.out.println("before clone,c1.strBuff = "+ c1.strBuff);   CloneC c2 = (CloneC)c1.clone();   c2.str = c2.str.substring(0,5);   c2.strBuff = c2.strBuff.append(" change strBuff clone");   System.out.println("=================================");   System.out.println("after clone,c1.str = "+ c1.str);   System.out.println("after clone,c1.strBuff = "+ c1.strBuff);   System.out.println("=================================");   System.out.println("after clone,c2.str = "+ c2.str);   System.out.println("after clone,c2.strBuff = "+ c2.strBuff);  } } /* RUN RESULT before clone,c1.str = initializeStr before clone,c1.strBuff = initializeStrBuff ================================= after clone,c1.str = initializeStr after clone,c1.strBuff = initializeStrBuff change strBuff clone ================================= after clone,c2.str = initi after clone,c2.strBuff = initializeStrBuff change strBuff clone * */

打印的结果可以看出,String类型的变量好象已经实现了深度clone,因为对c2.str的改动并没有影响到c1.str!难道Java把Sring类看成了基本数据类型?其实不然,这里有一个小小的把戏,秘密就在于c2.str = c2.str.substring(0,5)这一语句!实质上,在clone的时候c1.str与c2.str仍然是引用,而且都指向了同一个String对象。但在执行c2.str = c2.str.substring(0,5)的时候,它作用相当于生成了一个新的String类型,然后又赋回给c2.str。这是因为String被Sun公司的工程师写成了一个不可更改的类(immutable class),在所有String类中的函数都不能更改自身的值。下面给出很简单的一个例子:

package clone; public class StrTest {  public static void main(String[] args)  {   String str1 = "This is a test for immutable";   String str2 = str1.substring(0,8);   System.out.println("print str1 : " + str1);   System.out.println("print str2 : " + str2);  } } /* RUN RESULT print str1 : This is a test for immutable print str2 : This is */

例子中,虽然str1调用了substring()方法,但str1的值并没有改变。类似的,String类中的其它方法也是如此。当然如果我们把最上面的例子中的这两条语句

c2.str = c2.str.substring(0,5); c2.strBuff = c2.strBuff.append(" change strBuff clone");

改成下面这样:

c2.str.substring(0,5); c2.strBuff.append(" change strBuff clone");

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号