⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java中的指针,引用及对象的clone.htm

📁 javn的Java书籍JAVA集合框架.rar我看过了是很有帮助的
💻 HTM
📖 第 1 页 / 共 4 页
字号:

/** 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
*/
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>可以看出,现在b2.unCA的改变对b1.unCA没有产生影响。此时b1.unCA与b2.unCA指向了两个不同的UnCloneA实例,而且在CloneB 
      b2 = (CloneB)b1.clone();调用的那一刻b1和b2拥有相同的值,在这里,b1.i = b2.i = 11。</P>
      <P>要知道不是所有的类都能实现深度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();</P>
      <P>还要知道的是除了基本数据类型能自动实现深度clone以外,String对象是一个例外,它clone后的表现好象也实现了深度clone,虽然这只是一个假象,但却大大方便了我们的编程。</P>
      <P><A id=7 name=7><SPAN 
      class=atitle2>Clone中String和StringBuffer的区别</SPAN></A></P>
      <P>应该说明的是,这里不是着重说明String和StringBuffer的区别,但从这个例子里也能看出String类的一些与众不同的地方。</P>
      <P>下面的例子中包括两个类,CloneC类包含一个String类型变量和一个StringBuffer类型变量,并且实现了clone()方法。在StrClone类中声明了CloneC类型变量c1,然后调用c1的clone()方法生成c1的拷贝c2,在对c2中的String和StringBuffer类型变量用相应的方法改动之后打印结果:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>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
*
*/
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>打印的结果可以看出,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类中的函数都不能更改自身的值。下面给出很简单的一个例子:</P>
      <P>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 */</P>
      <P>例子中,虽然str1调用了substring()方法,但str1的值并没有改变。类似的,String类中的其它方法也是如此。当然如果我们把最上面的例子中的这两条语句</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>c2.str = c2.str.substring(0,5);
c2.strBuff = c2.strBuff.append(" change strBuff clone");
       </CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>改成下面这样:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>c2.str.substring(0,5);
c2.strBuff.append(" change strBuff clone");
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>去掉了重新赋值的过程,c2.str也就不能有变化了,我们的把戏也就露馅了。但在编程过程中只调用</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>c2.str.substring(0,5);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
      <P>语句是没有任何意义的。</P>
      <P>应该知道的是在Java中所有的基本数据类型都有一个相对应的类,象Integer类对应int类型,Double类对应double类型等等,这些类也与String类相同,都是不可以改变的类。也就是说,这些的类中的所有方法都是不能改变其自身的值的。这也让我们在编clone类的时候有了一个更多的选择。同时我们也可以把自己的类编成不可更改的类。</P><!-- AUTHOR BIOS --><!-- Make author heading singular or plural as needed -->
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR>
          <TD><A id=author1 name=author1><SPAN class=atitle2>关于作者</SPAN></A> 
            <BR>倪大鹏,有五年的软件开发经验,其中的近四年时间里是在从事与Java相关技术的应用与开发。你可以通过e-mail: <A 
            href="mailto:ndp@21cn.com">ndp@21cn.com</A>与他联系。</TD></TR></TBODY></TABLE></TD>
    <TD width=10><IMG height=1 alt="" src="JAVA中的指针,引用及对象的clone.files/c.gif" 
      width=10 border=0></TD></TR></TBODY></TABLE><!-- END PAPER BODY --><BR 
clear=all><IMG height=10 alt="" src="JAVA中的指针,引用及对象的clone.files/c.gif" width=100 
border=0><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right width="100%"><A 
      href="http://www-900.ibm.com/developerWorks/cn/java/l-jpointer/index.shtml#top">到页首</A></TD>
    <TD width=5><IMG height=1 alt="" src="JAVA中的指针,引用及对象的clone.files/c.gif" 
      width=5 border=0></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#000000 colSpan=2><IMG height=1 alt="" 
      src="JAVA中的指针,引用及对象的clone.files/c.gif" width=100 border=0></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff colSpan=2><IMG height=8 alt="" 
      src="JAVA中的指针,引用及对象的clone.files/c.gif" width=100 
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=10 width="100%" border=0>
  <TBODY>
  <TR vAlign=top>
    <TD>
      <FORM action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument 
      method=post><INPUT type=hidden value=JAVA中的指针,引用及对象的clone 
      name=ArticleTitle> <INPUT type=hidden value=Java name=Zone> <INPUT 
      type=hidden value=/developerWorks/cn/thankyou/feedback-java.html 
      name=RedirectURL> <A id=rating name=rating><B>您对这篇文章的看法如何?</B></A> 
      <TABLE cellSpacing=0 cellPadding=0 width=600 border=0>
        <TBODY>
        <TR>
          <TD colSpan=5><IMG height=8 alt="" 
            src="JAVA中的指针,引用及对象的clone.files/c.gif" width=100 border=0></TD></TR>
        <TR vAlign=top>
          <TD width="16%"><INPUT type=radio value=5 name=Rating>真棒!(5)</TD>
          <TD width="20%"><INPUT type=radio value=4 name=Rating>好材料 (4)</TD>
          <TD width="24%"><INPUT type=radio value=3 name=Rating>一般;尚可 (3)</TD>
          <TD width="22%"><INPUT type=radio value=2 name=Rating>需提高 (2)</TD>
          <TD width="18%"><INPUT type=radio value=1 name=Rating>太差! 
        (1)</TD></TR></TBODY></TABLE><BR><B>建议?</B><BR><TEXTAREA name=Comments rows=5 wrap=virtual cols=60></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff><IMG height=8 alt="" 
      src="JAVA中的指针,引用及对象的clone.files/c.gif" width=100 
border=0></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=right>(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 
      2001, All Right Reserved</TD></TR>
  <TR vAlign=top>
    <TD class=bbg height=21>&nbsp;&nbsp;<A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&amp;origin=dwhead">关于 
      IBM</A><SPAN class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A 
      class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&amp;origin=dwhead">隐私条约</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&amp;origin=dwhead">使用条款</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&amp;origin=dwhead">联系 
      IBM</A></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2 src="JAVA中的指针,引用及对象的clone.files/stats.js" 
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG height=1 alt="" 
src="D:\教学资料\基础软件\_中间件\J2EE\J2SE编程技术\J2SE补充\JAVA中的指针,引用及对象的clone.files\c(1).gif" 
width=1 border=0></NOSCRIPT> </A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -