java¿Ë¡¶ÔÏóclone()µÄÓ÷¨ºÍ×÷Óà -µçÄÔ×ÊÁÏ

µçÄÔ×ÊÁÏ Ê±¼ä£º2019-01-01 ÎÒҪͶ¸å
¡¾www.unjs.com - µçÄÔ×ÊÁÏ¡¿

   

ÄÚÈÝÕªÒª

    ÈôÐèÐÞ¸ÄÒ»¸ö¶ÔÏó£¬Í¬Ê±²»Ïë¸Ä±äµ÷ÓÃÕߵĶÔÏ󣬾ÍÒªÖÆ×÷¸Ã¶ÔÏóµÄÒ»¸ö±¾µØ¸±±¾£¬

java¿Ë¡¶ÔÏóclone()µÄÓ÷¨ºÍ×÷ÓÃ

¡£ÕâÒ²ÊDZ¾µØ¸±±¾×î³£¼ûµÄÒ»ÖÖÓÃ;¡£Èô¾ö¶¨ÖÆ×÷Ò»¸ö±¾µØ¸±±¾£¬Ö»Ðè¼òµ¥µØʹÓÃclone()·½·¨¼´¿É¡£CloneÊÇ“¿Ë¡”µÄÒâ˼£¬¼´ÖÆ×÷ÍêȫһģһÑùµÄ¸±±¾¡£Õâ¸ö·½·¨ÔÚ»ù´¡ÀàObjectÖж¨Òå³É“protected”£¨Êܱ£»¤£©Ä£Ê½¡£µ«ÔÚÏ£Íû¿Ë¡µÄÈκÎÑÜÉúÀàÖУ¬±ØÐ뽫Æ串¸ÇΪ“public”ģʽ¡£ÀýÈ磬±ê×¼¿âÀàVector¸²¸ÇÁËclone()£¬ËùÒÔÄÜΪVectorµ÷ÓÃclone()£¬

<code class="hljs" php="">дclone()·½·¨Ê±£¬Í¨³£¶¼ÓÐÒ»ÐдúÂë super.clone();clone ÓÐȱʡÐÐΪ£¬super.clone();ÒòΪÊ×ÏÈÒª°Ñ¸¸ÀàÖеijÉÔ±¸´ÖƵ½Î»£¬È»ºó²ÅÊǸ´ÖÆ×Ô¼ºµÄ³ÉÔ±¡£</code>

java¿Ë¡¶ÔÏó

    ÈôÐèÐÞ¸ÄÒ»¸ö¶ÔÏó£¬Í¬Ê±²»Ïë¸Ä±äµ÷ÓÃÕߵĶÔÏ󣬾ÍÒªÖÆ×÷¸Ã¶ÔÏóµÄÒ»¸ö±¾µØ¸±±¾¡£ÕâÒ²ÊDZ¾µØ¸±±¾×î³£¼ûµÄÒ»ÖÖÓÃ;¡£Èô¾ö¶¨ÖÆ×÷Ò»¸ö±¾µØ¸±±¾£¬Ö»Ðè¼òµ¥µØʹÓÃclone()·½·¨¼´¿É¡£CloneÊÇ“¿Ë¡”µÄÒâ˼£¬¼´ÖÆ×÷ÍêȫһģһÑùµÄ¸±±¾¡£Õâ¸ö·½·¨ÔÚ»ù´¡ÀàObjectÖж¨Òå³É“protected”£¨Êܱ£»¤£©Ä£Ê½¡£µ«ÔÚÏ£Íû¿Ë¡µÄÈκÎÑÜÉúÀàÖУ¬±ØÐ뽫Æ串¸ÇΪ“public”ģʽ¡£ÀýÈ磬±ê×¼¿âÀàVector¸²¸ÇÁËclone()£¬ËùÒÔÄÜΪVectorµ÷ÓÃclone()£¬ÈçÏÂËùʾ£º

<code class="hljs" cs="">import java.util.*;class Int {  private int i;  public Int(int ii) { i = ii; }  public void increment() { i++; }  public String toString() {     return Integer.toString(i);   }}public class Cloning {  public static void main(String[] args) {    Vector v = new Vector();    for(int i = 0; i < 10; i++ )      v.addElement(new Int(i));    System.out.println(v:  + v);    Vector v2 = (Vector)v.clone();    for(Enumeration e = v2.elements();        e.hasMoreElements(); )      ((Int)e.nextElement()).increment();    System.out.println(v:  + v);  }}</code>

    clone()·½·¨²úÉúÁËÒ»¸öObject£¬ºóÕß±ØÐëÁ¢¼´ÖØÐÂÔìÐÍΪÕýÈ·ÀàÐÍ¡£Õâ¸öÀý×ÓÖ¸³öVectorµÄclone()·½·¨²»ÄÜ×Ô¶¯³¢ÊÔ¿Ë¡VectorÄÚ°üº¬µÄÿ¸ö¶ÔÏó——ÓÉÓÚ±ðÃûÎÊÌ⣬ÀϵÄVectorºÍ¿Ë¡µÄVector¶¼°üº¬ÁËÏàͬµÄ¶ÔÏó¡£ÎÒÃÇͨ³£°ÑÕâÖÖÇé¿ö½Ð×÷“¼òµ¥¸´ÖÆ”»òÕߓdz²ã¸´ÖÆ”£¬ÒòΪËüÖ»¸´ÖÆÁËÒ»¸ö¶ÔÏóµÄ“±íÃ攲¿·Ö¡£Êµ¼Ê¶ÔÏó³ý°üº¬Õâ¸ö“±íÃæ”ÒÔÍ⣬»¹°üÀ¨¾ä±úÖ¸ÏòµÄËùÓжÔÏó£¬ÒÔ¼°ÄÇЩ¶ÔÏóÓÖÖ¸ÏòµÄÆäËûËùÓжÔÏó£¬ÓÉ´ËÀàÍÆ¡£Õâ±ãÊÇ“¶ÔÏóÍø”»ò“¶ÔÏó¹ØϵÍø”µÄÓÉÀ´¡£ÈôÄܸ´ÖÆÏÂËùÓÐÕâÕÅÍø£¬±ã½Ð×÷“È«Ã渴ÖÆ”»òÕß“Éî²ã¸´ÖÆ”¡£

    ÔÚÊä³öÖпɿ´µ½Ç³²ã¸´ÖƵĽá¹û£¬×¢Òâ¶Ôv2²ÉÈ¡µÄÐж¯Ò²»áÓ°Ïìµ½v£º

<code class="hljs" http="">v: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]v: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</code>

    Ò»°ãÀ´Ëµ£¬ÓÉÓÚ²»¸Ò±£Ö¤VectorÀï°üº¬µÄ¶ÔÏóÊÇ“¿ÉÒÔ¿Ë¡”£¨×¢ÊÍ¢Ú£©µÄ£¬ËùÒÔ×îºÃ²»ÒªÊÔͼ¿Ë¡ÄÇЩ¶ÔÏó¡£

ʹÀà¾ßÓпË¡ÄÜÁ¦

    ¾¡¹Ü¿Ë¡·½·¨ÊÇÔÚËùÓÐÀà×î»ù±¾µÄObjectÖж¨ÒåµÄ£¬µ«¿Ë¡ÈÔÈ»²»»áÔÚÿ¸öÀàÀï×Ô¶¯½øÐС£ÕâËƺõÓÐЩ²»¿É˼Ò飬ÒòΪ»ù´¡Àà·½·¨ÔÚÑÜÉúÀàÀïÊǿ϶¨ÄÜÓõġ£µ«JavaȷʵÓеã¶ù·´ÆäµÀ¶øÐÐÖ®£»Èç¹ûÏëÔÚÒ»¸öÀàÀïʹÓÿË¡·½·¨£¬Î¨Ò»µÄ°ì·¨¾ÍÊÇרÃÅÌí¼ÓһЩ´úÂ룬ÒԱ㱣֤¿Ë¡µÄÕý³£½øÐС£

    ʹÓÃprotectedʱµÄ¼¼ÇÉ

    Ϊ±ÜÃâÎÒÃÇ´´½¨µÄÿ¸öÀ඼ĬÈϾßÓпË¡ÄÜÁ¦£¬clone()·½·¨ÔÚ»ù´¡ÀàObjectÀïµÃµ½ÁË“±£Áô”£¨ÉèΪprotected£©¡£ÕâÑùÔì³ÉµÄºó¹û¾ÍÊÇ£º¶ÔÄÇЩ¼òµ¥µØʹÓÃÒ»ÏÂÕâ¸öÀàµÄ¿Í»§³ÌÐòÔ±À´Ëµ£¬ËûÃDz»»áĬÈϵØÓµÓÐÕâ¸ö·½·¨£»Æä´Î£¬ÎÒÃDz»ÄÜÀûÓÃÖ¸Ïò»ù´¡ÀàµÄÒ»¸ö¾ä±úÀ´µ÷ÓÃclone()£¨¾¡¹ÜÄÇÑù×öÔÚijЩÇé¿öÏÂÌرðÓÐÓ㬱ÈÈçÓöàÐÎÐԵķ½Ê½¿Ë¡һϵÁжÔÏ󣩡£ÔÚ±àÒëÆÚµÄʱºò£¬Õâʵ¼ÊÊÇ֪ͨÎÒÃǶÔÏ󲻿ɿË¡µÄÒ»ÖÖ·½Ê½——¶øÇÒ×îÆæ¹ÖµÄÊÇ£¬Java¿âÖеĴó¶àÊýÀ඼²»ÄÜ¿Ë¡¡£Òò´Ë£¬¼ÙÈçÎÒÃÇÖ´ÐÐÏÂÊö´úÂ룺

    Integer x = new Integer(l);

    x = x.clone();

    ÄÇôÔÚ±àÒëÆÚ£¬¾ÍÓÐÒ»ÌõÌÖÑáµÄ´íÎóÏûÏ¢µ¯³ö£¬¸æËßÎÒÃDz»¿É·ÃÎÊclone()——ÒòΪInteger²¢Ã»Óи²¸ÇËü£¬¶øÇÒËü¶Ôprotected°æ±¾À´ËµÊÇĬÈϵģ©¡£

    µ«ÊÇ£¬¼ÙÈôÎÒÃÇÊÇÔÚÒ»¸ö´ÓObjectÑÜÉú³öÀ´µÄÀàÖУ¨ËùÓÐÀ඼ÊÇ´ÓObjectÑÜÉúµÄ£©£¬¾ÍÓÐȨµ÷ÓÃObject.clone()£¬ÒòΪËüÊÇ“protected”£¬¶øÇÒÎÒÃÇÔÚÒ»¸ö¼Ì³ÐÆ÷ÖС£»ù´¡Ààclone()ÌṩÁËÒ»¸öÓÐÓõŦÄÜ——Ëü½øÐеÄÊǶÔÑÜÉúÀà¶ÔÏóµÄÕæÕý“°´Î»”¸´ÖÆ£¬ËùÒÔÏ൱ÓÚ±ê×¼µÄ¿Ë¡Ðж¯¡£È»¶ø£¬ÎÒÃÇËæºóÐèÒª½«×Ô¼ºµÄ¿Ë¡²Ù×÷ÉèΪpublic£¬·ñÔòÎÞ·¨·ÃÎÊ¡£×ÜÖ®£¬¿Ë¡ʱҪעÒâµÄÁ½¸ö¹Ø¼üÎÊÌâÊÇ£º¼¸ºõ¿Ï¶¨Òªµ÷ÓÃsuper.clone()£¬ÒÔ¼°×¢Ò⽫¿Ë¡ÉèΪpublic¡£

    ÓÐʱ»¹ÏëÔÚ¸üÉî²ãµÄÑÜÉúÀàÖи²¸Çclone()£¬·ñÔò¾ÍÖ±½ÓʹÓÃÎÒÃǵÄclone()£¨ÏÖÔÚÒѳÉΪpublic£©£¬¶øÄDz¢²»Ò»¶¨ÊÇÎÒÃÇËùÏ£ÍûµÄ£¨È»¶ø£¬ÓÉÓÚObject.clone()ÒÑÖÆ×÷ÁËʵ¼Ê¶ÔÏóµÄÒ»¸ö¸±±¾£¬ËùÒÔÒ²ÓпÉÄÜÔÊÐíÕâÖÖÇé¿ö£©¡£protectedµÄ¼¼ÇÉÔÚÕâÀïÖ»ÄÜÓÃÒ»´Î£ºÊ״δÓÒ»¸ö²»¾ß±¸¿Ë¡ÄÜÁ¦µÄÀà¼Ì³Ð£¬¶øÇÒÏëʹһ¸öÀà±ä³É“Äܹ»¿Ë¡”¡£¶øÔÚ´ÓÎÒÃǵÄÀà¼Ì³ÐµÄÈκγ¡ºÏ£¬clone()·½·¨¶¼ÊÇ¿ÉÒÔʹÓõģ¬ÒòΪJava²»¿ÉÄÜÔÚÑÜÉúÖ®ºó·´¶øËõС·½·¨µÄ·ÃÎÊ·¶Î§¡£»»ÑÔÖ®£¬Ò»µ©¶ÔÏó±äµÃ¿ÉÒÔ¿Ë¡£¬´ÓËüÑÜÉúµÄÈκζ«Î÷¶¼ÊÇÄܹ»¿Ë¡µÄ£¬³ý·ÇʹÓÃÌØÊâµÄ»úÖÆ£¨ºóÃæÌÖÂÛ£©ÁîÆ䓹رՔ¿Ë¡ÄÜÁ¦¡£

    ʵÏÖCloneable½Ó¿Ú

    Ϊʹһ¸ö¶ÔÏóµÄ¿Ë¡ÄÜÁ¦¹¦³ÉÔ²Âú£¬»¹ÐèÒª×öÁíÒ»¼þÊÂÇ飺ʵÏÖCloneable½Ó¿Ú¡£Õâ¸ö½Ó¿ÚʹÈËÉÔ¾õÆæ¹Ö£¬ÒòΪËüÊǿյģ¡

    interface Cloneable {}

    Ö®ËùÒÔҪʵÏÖÕâ¸ö¿Õ½Ó¿Ú£¬ÏÔÈ»²»ÊÇÒòΪÎÒÃÇ×¼±¸ÉÏËÝÔìÐͳÉÒ»¸öCloneable£¬ÒÔ¼°µ÷ÓÃËüµÄij¸ö·½·¨¡£ÓÐЩÈËÈÏΪÔÚÕâÀïʹÓýӿÚÊôÓÚÒ»ÖÖ“ÆÛÆ­”ÐÐΪ£¬ÒòΪËüʹÓõÄÌØÐÔ´òµÄÊDZðµÄÖ÷Ò⣬¶ø·ÇÔ­À´µÄÒâ˼¡£Cloneable interfaceµÄʵÏÖ°çÑÝÁËÒ»¸ö±ê¼ÇµÄ½ÇÉ«£¬·â×°µ½ÀàµÄÀàÐÍÖС£

    Á½·½ÃæµÄÔ­Òò´Ù³ÉÁËCloneable interfaceµÄ´æÔÚ¡£Ê×ÏÈ£¬¿ÉÄÜÓÐÒ»¸öÉÏËÝÔìÐ;ä±úÖ¸ÏòÒ»¸ö»ù´¡ÀàÐÍ£¬¶øÇÒ²»ÖªµÀËüÊÇ·ñÕæµÄÄÜ¿Ë¡ÄǸö¶ÔÏó¡£ÔÚÕâÖÖÇé¿öÏ£¬¿ÉÓÃinstanceof¹Ø¼ü×Ö£¨µÚ11ÕÂÓнéÉÜ£©µ÷²é¾ä±úÊÇ·ñȷʵͬһ¸öÄÜ¿Ë¡µÄ¶ÔÏóÁ¬½Ó£º

    if(myHandle instanceof Cloneable) // …

    µÚ¶þ¸öÔ­ÒòÊÇ¿¼Âǵ½ÎÒÃÇ¿ÉÄܲ»Ô¸ËùÓжÔÏóÀàÐͶ¼ÄÜ¿Ë¡¡£ËùÒÔObject.clone()»áÑéÖ¤Ò»¸öÀàÊÇ·ñÕæµÄÊÇʵÏÖÁËCloneable½Ó¿Ú¡£Èô´ð°¸ÊÇ·ñ¶¨µÄ£¬Ôò“ÖÀ”³öÒ»¸öCloneNotSupportedExceptionÎ¥Àý¡£ËùÒÔÔÚÒ»°ãÇé¿öÏ£¬ÎÒÃDZØÐ뽫“implement Cloneable”×÷Ϊ¶Ô¿Ë¡ÄÜÁ¦Ìṩ֧³ÖµÄÒ»²¿·Ö¡£

javaµÄcloneʵÏÖ

    Àí½âÁËʵÏÖclone()·½·¨±³ºóµÄËùÓÐϸ½Úºó£¬±ã¿É´´½¨³öÄÜ·½±ã¸´ÖƵÄÀ࣬ÒÔ±ãÌṩÁËÒ»¸ö±¾µØ¸±±¾£º

<code class="hljs" cs="">import java.util.*;class MyObject implements Cloneable {  int i;  MyObject(int ii) { i = ii; }  public Object clone() {    Object o = null;    try {      o = super.clone();    } catch (CloneNotSupportedException e) {      System.out.println(MyObject can't clone);    }    return o;  }  public String toString() {    return Integer.toString(i);  }}public class LocalCopy {  static MyObject g(MyObject v) {     v.i++;    return v;  }  static MyObject f(MyObject v) {     v.i++;    return v;  }  public static void main(String[] args) {    MyObject a = new MyObject(11);    MyObject b = g(a);     if(a == b)       System.out.println(a == b);    else       System.out.println(a != b);    System.out.println(a =  + a);    System.out.println(b =  + b);    MyObject c = new MyObject(47);    MyObject d = f(c);    if(c == d)       System.out.println(c == d);    else       System.out.println(c != d);    System.out.println(c =  + c);    System.out.println(d =  + d);  }}</code>

    ²»¹ÜÔõÑù£¬clone()±ØÐëÄܹ»·ÃÎÊ£¬ËùÒÔ±ØÐ뽫ÆäÉèΪpublic£¨¹«¹²µÄ£©¡£Æä´Î£¬×÷Ϊclone()µÄ³õÆÚÐж¯£¬Ó¦µ÷ÓÃclone()µÄ»ù´¡Àà°æ±¾¡£ÕâÀïµ÷ÓõÄclone()ÊÇObjectÄÚ²¿Ô¤Ïȶ¨ÒåºÃµÄ¡£Ö®ËùÒÔÄܵ÷ÓÃËü£¬ÊÇÓÉÓÚËü¾ßÓÐprotected£¨Êܵ½±£»¤µÄ£©ÊôÐÔ£¬ËùÒÔÄÜÔÚÑÜÉúµÄÀàÀï·ÃÎÊ¡£

    Object.clone()»á¼ì²éÔ­ÏȵĶÔÏóÓжà´ó£¬ÔÙΪжÔÏóÌÚ³ö×ã¹»¶àµÄÄڴ棬½«ËùÓжþ½øÖÆλ´ÓÔ­À´µÄ¶ÔÏó¸´ÖƵ½Ð¶ÔÏó¡£Õâ½Ð×÷“°´Î»¸´ÖÆ”£¬¶øÇÒ°´Ò»°ãµÄÏë·¨£¬Õâ¸ö¹¤×÷Ó¦¸ÃÊÇÓÉclone()·½·¨À´×öµÄ¡£µ«ÔÚObject.clone()Õýʽ¿ªÊ¼²Ù×÷Ç°£¬Ê×ÏÈ»á¼ì²éÒ»¸öÀàÊÇ·ñCloneable£¬¼´ÊÇ·ñ¾ßÓпË¡ÄÜÁ¦——»»ÑÔÖ®£¬ËüÊÇ·ñʵÏÖÁËCloneable½Ó¿Ú¡£ÈôδʵÏÖ£¬Object.clone()¾ÍÖÀ³öÒ»¸öCloneNotSupportedExceptionÎ¥Àý£¬Ö¸³öÎÒÃDz»ÄÜ¿Ë¡Ëü¡£Òò´Ë£¬ÎÒÃÇ×îºÃÓÃÒ»¸ötry-catch¿é½«¶Ôsuper.clone()µÄµ÷ÓôúÂë°üΧ£¨»ò·â×°£©ÆðÀ´£¬ÊÔͼ²¶»ñÒ»¸öÓ¦µ±ÓÀ²»³öÏÖµÄÎ¥Àý£¨ÒòΪÕâÀïȷʵÒÑʵÏÖÁËCloneable½Ó¿Ú£©¡£

    ÔÚLocalCopyÖУ¬Á½¸ö·½·¨g()ºÍf()½Òʾ³öÁ½ÖÖ²ÎÊý´«µÝ·½·¨¼äµÄ²îÒì¡£ÆäÖУ¬g()ÑÝʾµÄÊÇ°´ÒýÓô«µÝ£¬Ëü»áÐÞ¸ÄÍⲿ¶ÔÏ󣬲¢·µ»Ø¶ÔÄǸöÍⲿ¶ÔÏóµÄÒ»¸öÒýÓ᣶øf()ÊǶÔ×Ô±äÁ¿½øÐпË¡£¬ËùÒÔ½«Æä·ÖÀë³öÀ´£¬²¢ÈÃÔ­À´µÄ¶ÔÏó±£³Ö¶ÀÁ¢¡£Ëæºó£¬Ëü¼ÌÐø×öËüÏ£ÍûµÄÊÂÇé¡£ÉõÖÁÄÜ·µ»ØÖ¸ÏòÕâ¸öжÔÏóµÄÒ»¸ö¾ä±ú£¬¶øÇÒ²»»á¶ÔÔ­À´µÄ¶ÔÏó²úÉúÈκθ±×÷Óá£×¢ÒâÏÂÃæÕâ¸ö¶àÉÙÓÐЩ¹Å¹ÖµÄÓï¾ä£º

    v = (MyObject)v.clone();

    ËüµÄ×÷ÓÃÕýÊÇ´´½¨Ò»¸ö±¾µØ¸±±¾¡£Îª±ÜÃâ±»ÕâÑùµÄÒ»¸öÓï¾ä¸ã»ìÏý£¬¼ÇסÕâÖÖÏ൱Ææ¹ÖµÄ±àÂëÐÎʽÔÚJavaÖÐÊÇÍêÈ«ÔÊÐíµÄ£¬ÒòΪÓÐÒ»¸öÃû×ÖµÄËùÓж«Î÷ʵ¼Ê¶¼ÊÇÒ»¸ö¾ä±ú¡£ËùÒÔ¾ä±úvÓÃÓÚ¿Ë¡һ¸öËüËùÖ¸ÏòµÄ¸±±¾£¬¶øÇÒ×îÖÕ·µ»ØÖ¸Ïò»ù´¡ÀàÐÍObjectµÄÒ»¸ö¾ä±ú£¨ÒòΪËüÔÚObject.clone()ÖÐÊÇÄÇÑù±»¶¨ÒåµÄ£©£¬Ëæºó±ØÐ뽫ÆäÔìÐÍΪÕýÈ·µÄÀàÐÍ¡£

    ÔÚmain()ÖУ¬Á½ÖÖ²»Í¬²ÎÊý´«µÝ·½Ê½µÄÇø±ðÔÚÓÚËüÃÇ·Ö±ð²âÊÔÁËÒ»¸ö²»Í¬µÄ·½·¨¡£Êä³ö½á¹ûÈçÏ£º

<code class="hljs" makefile="">a == ba = 12b = 12c != dc = 47d =48</code>

    ´ó¼ÒÒª¼ÇסÕâÑùÒ»¸öÊÂʵ£ºJava¶Ô“ÊÇ·ñµÈ¼Û”µÄ²âÊÔ²¢²»¶ÔËù±È½Ï¶ÔÏóµÄÄÚ²¿½øÐмì²é£¬´Ó¶øºËʵËüÃǵÄÖµÊÇ·ñÏàͬ¡£==ºÍ!=ÔËËã·ûÖ»ÊǼòµ¥µØ¶Ô±È¾ä±úµÄÄÚÈÝ¡£Èô¾ä±úÄڵĵØÖ·Ïàͬ£¬¾ÍÈÏΪ¾ä±úÖ¸ÏòͬÑùµÄ¶ÔÏó£¬ËùÒÔÈÏΪËüÃÇÊÇ“µÈ¼Û”µÄ¡£ËùÒÔÔËËã·ûÕæÕý¼ì²âµÄÊÇ“ÓÉÓÚ±ðÃûÎÊÌ⣬¾ä±úÊÇ·ñÖ¸Ïòͬһ¸ö¶ÔÏ󣿔

java Object.clone()µÄЧ¹û

    µ÷ÓÃObject.clone()ʱ£¬Êµ¼Ê·¢ÉúµÄÊÇʲôÊÂÇéÄØ£¿µ±ÎÒÃÇÔÚ×Ô¼ºµÄÀàÀ︲¸Çclone()ʱ£¬Ê²Ã´¶«Î÷¶ÔÓÚsuper.clone()À´ËµÊÇ×î¹Ø¼üµÄÄØ£¿¸ùÀàÖеÄclone()·½·¨¸ºÔð½¨Á¢ÕýÈ·µÄ´æ´¢ÈÝÁ¿£¬²¢Í¨¹ý“°´Î»¸´ÖÆ”½«¶þ½øÖÆλ´Óԭʼ¶ÔÏóÖи´ÖƵ½Ð¶ÔÏóµÄ´æ´¢¿Õ¼ä¡£Ò²¾ÍÊÇ˵£¬Ëü²¢²»Ö»ÊÇÔ¤Áô´æ´¢¿Õ¼äÒÔ¼°¸´ÖÆÒ»¸ö¶ÔÏó——ʵ¼ÊÐèÒªµ÷²é³öÓû¸´ÖÆÖ®¶ÔÏóµÄ׼ȷ´óС£¬È»ºó¸´ÖÆÄǸö¶ÔÏó¡£ÓÉÓÚËùÓÐÕâЩ¹¤×÷¶¼ÊÇÔÚÓɸùÀඨÒåÖ®clone()·½·¨µÄÄÚ²¿´úÂëÖнøÐеģ¨¸ùÀಢ²»ÖªµÀÒª´Ó×Ô¼ºÕâÀï¼Ì³Ð³öȥʲô£©£¬ËùÒÔ´ó¼Ò»òÐíÒѾ­²Âµ½£¬Õâ¸ö¹ý³ÌÐèÒªÓÃRTTIÅжÏÓû¿Ë¡µÄ¶ÔÏóµÄʵ¼Ê´óС¡£²ÉÈ¡ÕâÖÖ·½Ê½£¬clone()·½·¨±ã¿É½¨Á¢ÆðÕýÈ·ÊýÁ¿µÄ´æ´¢¿Õ¼ä£¬²¢¶ÔÄǸöÀàÐͽøÐÐÕýÈ·µÄ°´Î»¸´ÖÆ¡£

    ²»¹ÜÎÒÃÇÒª×öʲô£¬¿Ë¡¹ý³ÌµÄµÚÒ»¸ö²¿·Öͨ³£¶¼Ó¦¸ÃÊǵ÷ÓÃsuper.clone()¡£Í¨¹ý½øÐÐÒ»´Î׼ȷµÄ¸´ÖÆ£¬ÕâÑù×ö¿ÉΪºóÐøµÄ¿Ë¡½ø³Ì½¨Á¢ÆðÒ»¸öÁ¼ºÃµÄ»ù´¡¡£Ëæºó£¬¿É²ÉÈ¡ÁíһЩ±ØÒªµÄ²Ù×÷£¬ÒÔÍê³É×îÖյĿË¡¡£

    ΪȷÇÐÁ˽âÆäËû²Ù×÷ÊÇʲô£¬Ê×ÏÈÒªÕýÈ·Àí½âObject.clone()ΪÎÒÃÇ´øÀ´ÁËʲô¡£ÌرðµØ£¬Ëü»á×Ô¶¯¿Ë¡ËùÓоä±úÖ¸ÏòµÄÄ¿±êÂð£¿ÏÂÃæÕâ¸öÀý×Ó¿ÉÍê³ÉÕâÖÖÐÎʽµÄ¼ì²â£º

<code class="hljs" java="">public class Snake implements Cloneable {  private Snake next;  private char c;   Snake(int i, char x) {    c = x;    if(--i > 0)      next = new Snake(i, (char)(x + 1));  }  void increment() {    c++;    if(next != null)      next.increment();  }  public String toString() {    String s = : + c;    if(next != null)      s += next.toString();    return s;  }  public Object clone() {    Object o = null;    try {      o = super.clone();    } catch (CloneNotSupportedException e) {}    return o;  }  public static void main(String[] args) {    Snake s = new Snake(5, 'a');    System.out.println(s =  + s);    Snake s2 = (Snake)s.clone();    System.out.println(s2 =  + s2);    s.increment();    System.out.println(      after s.increment, s2 =  + s2);  }}</code>

    Ò»ÌõSnake£¨Éߣ©ÓÉÊý¶Î¹¹³É£¬Ã¿Ò»¶ÎµÄÀàÐͶ¼ÊÇSnake£¬

µçÄÔ×ÊÁÏ

¡¶java¿Ë¡¶ÔÏóclone()µÄÓ÷¨ºÍ×÷Óá·(https://www.unjs.com)¡£ËùÒÔ£¬ÕâÊÇÒ»¸öÒ»¶Î¶ÎÁ´½ÓÆðÀ´µÄÁÐ±í¡£ËùÓжζ¼ÊÇÒÔÑ­»··½Ê½´´½¨µÄ£¬Ã¿×öºÃÒ»¶Î£¬¶¼»áʹµÚÒ»¸ö¹¹½¨Æ÷²ÎÊýµÄÖµµÝ¼õ£¬Ö±ÖÁ×îÖÕΪÁã¡£¶øΪ¸øÿ¶Î¸³ÓèÒ»¸ö¶ÀÒ»ÎÞ¶þµÄ±ê¼Ç£¬µÚ¶þ¸ö²ÎÊý£¨Ò»¸öChar£©µÄÖµÔÚÿ´ÎÑ­»·¹¹½¨Æ÷µ÷ÓÃʱ¶¼»áµÝÔö¡£

    increment()·½·¨µÄ×÷ÓÃÊÇÑ­»·µÝÔöÿ¸ö±ê¼Ç£¬Ê¹ÎÒÃÇÄÜ¿´µ½·¢ÉúµÄ±ä»¯£»¶øtoStringÔòÑ­»·´òÓ¡³öÿ¸ö±ê¼Ç¡£Êä³öÈçÏ£º

    s = :a:b:c:d:e

    s2 = :a:b:c:d:e

    after s.increment, s2 = :a:c:d:e:f

    ÕâÒâζ×ÅÖ»ÓеÚÒ»¶Î²ÅÊÇÓÉObject.clone()¸´ÖƵģ¬ËùÒÔ´Ëʱ½øÐеÄÊÇÒ»Ö֓dz²ã¸´ÖÆ”¡£ÈôÏ£Íû¸´ÖÆÕûÌõÉß——¼´½øÐГÉî²ã¸´ÖÆ”——±ØÐëÔÚ±»¸²¸ÇµÄclone()Àï²ÉÈ¡¸½¼ÓµÄ²Ù×÷¡£

    ͨ³£¿ÉÔÚ´ÓÒ»¸öÄÜ¿Ë¡µÄÀàÀïµ÷ÓÃsuper.clone()£¬ÒÔÈ·±£ËùÓлù´¡ÀàÐж¯£¨°üÀ¨Object.clone()£©Äܹ»½øÐС£Ëæ×ÅÊÇΪ¶ÔÏóÄÚÿ¸ö¾ä±ú¶¼Ã÷È·µ÷ÓÃÒ»¸öclone()£»·ñÔòÄÇЩ¾ä±ú»á±ðÃû±ä³Éԭʼ¶ÔÏóµÄ¾ä±ú¡£¹¹½¨Æ÷µÄµ÷ÓÃÒ²´óÖÂÏàͬ——Ê×Ïȹ¹Ôì»ù´¡À࣬ȻºóÊÇÏÂÒ»¸öÑÜÉúµÄ¹¹½¨Æ÷……ÒÔ´ËÀàÍÆ£¬Ö±µ½Î»ÓÚ×îÉî²ãµÄÑÜÉú¹¹½¨Æ÷¡£Çø±ðÔÚÓÚclone()²¢²»ÊǸö¹¹½¨Æ÷£¬ËùÒÔûÓа취ʵÏÖ×Ô¶¯¿Ë¡¡£ÎªÁË¿Ë¡£¬±ØÐëÓÉ×Ô¼ºÃ÷È·½øÐС£

¿Ë¡ºÏ³É¶ÔÏó

    ÊÔͼÉî²ã¸´ÖƺϳɶÔÏóʱ»áÓöµ½Ò»¸öÎÊÌâ¡£±ØÐë¼Ù¶¨³ÉÔ±¶ÔÏóÖеÄclone()·½·¨Ò²ÄÜÒÀ´Î¶Ô×Ô¼ºµÄ¾ä±ú½øÐÐÉî²ã¸´ÖÆ£¬ÒÔ´ËÀàÍÆ¡£ÕâʹÎÒÃǵIJÙ×÷±äµÃ¸´ÔÓ¡£ÎªÁËÄÜÕý³£ÊµÏÖÉî²ã¸´ÖÆ£¬±ØÐë¶ÔËùÓÐÀàÖеĴúÂë½øÐпØÖÆ£¬»òÕßÖÁÉÙÈ«ÃæÕÆÎÕÉî²ã¸´ÖÆÖÐÐèÒªÉæ¼°µÄÀ࣬ȷ±£ËüÃÇ×Ô¼ºµÄÉî²ã¸´ÖÆÄÜÕýÈ·½øÐС£

    ÏÂÃæÕâ¸öÀý×Ó×ܽáÁËÃæ¶ÔÒ»¸öºÏ³É¶ÔÏó½øÐÐÉî²ã¸´ÖÆʱÐèÒª×öÄÄЩÊÂÇ飺

<code axapta="" class="hljs">class DepthReading implements Cloneable {  private double depth;  public DepthReading(double depth) {     this.depth = depth;  }  public Object clone() {    Object o = null;    try {      o = super.clone();    } catch (CloneNotSupportedException e) {      e.printStackTrace();    }    return o;  }}class TemperatureReading implements Cloneable {  private long time;  private double temperature;  public TemperatureReading(double temperature) {    time = System.currentTimeMillis();    this.temperature = temperature;  }  public Object clone() {    Object o = null;    try {      o = super.clone();    } catch (CloneNotSupportedException e) {      e.printStackTrace();    }    return o;  }}class OceanReading implements Cloneable {  private DepthReading depth;  private TemperatureReading temperature;  public OceanReading(double tdata, double ddata){    temperature = new TemperatureReading(tdata);    depth = new DepthReading(ddata);  }  public Object clone() {    OceanReading o = null;    try {      o = (OceanReading)super.clone();    } catch (CloneNotSupportedException e) {      e.printStackTrace();    }    o.depth = (DepthReading)o.depth.clone();    o.temperature =       (TemperatureReading)o.temperature.clone();    return o;   }}public class DeepCopy {  public static void main(String[] args) {    OceanReading reading =       new OceanReading(33.9, 100.5);    OceanReading r =       (OceanReading)reading.clone();  }}</code>

    DepthReadingºÍTemperatureReading·Ç³£ÏàËÆ£»ËüÃǶ¼Ö»°üº¬ÁË»ù±¾Êý¾ÝÀàÐÍ¡£ËùÒÔclone()·½·¨Äܹ»·Ç³£¼òµ¥£ºµ÷ÓÃsuper.clone()²¢·µ»Ø½á¹û¼´¿É¡£×¢ÒâÁ½¸öÀàʹÓõÄclone()´úÂëÊÇÍêÈ«Ò»Öµġ£

    OceanReadingÊÇÓÉDepthReadingºÍTemperatureReading¶ÔÏóºÏ²¢¶ø³ÉµÄ¡£ÎªÁ˶ÔÆä½øÐÐÉî²ã¸´ÖÆ£¬clone()±ØÐëͬʱ¿Ë¡OceanReadingÄڵľä±ú¡£Îª´ïµ½Õâ¸öÄ¿±ê£¬super.clone()µÄ½á¹û±ØÐëÔìÐͳÉÒ»¸öOceanReading¶ÔÏó£¨ÒÔ±ã·ÃÎÊdepthºÍtemperature¾ä±ú£©¡£

    java.lang.ObjectÀïÃæÓÐÒ»¸ö·½·¨clone()

    protected Object clone()

    throws CloneNotSupportedException´´½¨²¢·µ»Ø´Ë¶ÔÏóµÄÒ»¸ö¸±±¾¡£“¸±±¾”µÄ׼ȷº¬Òå¿ÉÄÜÒÀÀµÓÚ¶ÔÏóµÄÀà¡£ÕâÑù×öµÄÄ¿µÄÊÇ£¬¶ÔÓÚÈκζÔÏó x£¬±í´ïʽ£º

    x.clone() != xΪ true£¬±í´ïʽ£º

    x.clone().getClass() == x.getClass()ҲΪ true£¬µ«ÕâЩ²¢·Ç±ØÐëÒªÂú×ãµÄÒªÇó¡£Ò»°ãÇé¿öÏ£º

    x.clone().equals(x)Ϊ true£¬µ«Õâ²¢·Ç±ØÐëÒªÂú×ãµÄÒªÇó¡£

    °´ÕÕ¹ßÀý£¬·µ»ØµÄ¶ÔÏóÓ¦¸Ãͨ¹ýµ÷Óà super.clone »ñµÃ¡£Èç¹ûÒ»¸öÀ༰ÆäËùÓеij¬ÀࣨObject ³ýÍ⣩¶¼×ñÊØ´ËÔ¼¶¨£¬Ôò x.clone().getClass() == x.getClass()¡£

    °´ÕÕ¹ßÀý£¬´Ë·½·¨·µ»ØµÄ¶ÔÏóÓ¦¸Ã¶ÀÁ¢ÓڸöÔÏó£¨Õý±»¸´ÖƵĶÔÏ󣩡£Òª»ñµÃ´Ë¶ÀÁ¢ÐÔ£¬ÔÚ super.clone ·µ»Ø¶ÔÏó֮ǰ£¬ÓбØÒª¶Ô¸Ã¶ÔÏóµÄÒ»¸ö»ò¶à¸ö×ֶνøÐÐÐ޸ġ£Õâͨ³£Òâζ×ÅÒª¸´ÖÆ°üº¬ÕýÔÚ±»¸´ÖƶÔÏóµÄÄÚ²¿“Éî²ã½á¹¹”µÄËùÓпɱä¶ÔÏ󣬲¢Ê¹ÓöԸ±±¾µÄÒýÓÃÌæ»»¶ÔÕâЩ¶ÔÏóµÄÒýÓá£Èç¹ûÒ»¸öÀàÖ»°üº¬»ù±¾×ֶλò¶Ô²»±ä¶ÔÏóµÄÒýÓã¬ÄÇôͨ³£²»ÐèÒªÐÞ¸Ä super.clone ·µ»ØµÄ¶ÔÏóÖеÄ×ֶΡ£

    Object ÀàµÄ clone ·½·¨Ö´ÐÐÌض¨µÄ¸´ÖƲÙ×÷¡£Ê×ÏÈ£¬Èç¹û´Ë¶ÔÏóµÄÀ಻ÄÜʵÏÖ½Ó¿Ú Cloneable£¬Ôò»áÅ׳ö CloneNotSupportedException¡£×¢Ò⣬ËùÓеÄÊý×鶼±»ÊÓΪʵÏÖ½Ó¿Ú Cloneable¡£·ñÔò£¬´Ë·½·¨»á´´½¨´Ë¶ÔÏóµÄÀàµÄÒ»¸öÐÂʵÀý£¬²¢Ïñͨ¹ý·ÖÅäÄÇÑù£¬ÑϸñʹÓô˶ÔÏóÏàÓ¦×ֶεÄÄÚÈݳõʼ»¯¸Ã¶ÔÏóµÄËùÓÐ×ֶΣ»ÕâЩ×ֶεÄÄÚÈÝûÓб»×ÔÎÒ¸´ÖÆ¡£ËùÒÔ£¬´Ë·½·¨Ö´ÐеÄÊǸöÔÏóµÄ“dz±í¸´ÖÆ”£¬¶ø²»“Éî²ã¸´ÖÆ”²Ù×÷¡£

    Object Àà±¾Éí²»ÊµÏÖ½Ó¿Ú Cloneable£¬ËùÒÔÔÚÀàΪ Object µÄ¶ÔÏóÉϵ÷Óà clone ·½·¨½«»áµ¼ÖÂÔÚÔËÐÐʱÅ׳öÒì³£¡£

    ·µ»Ø£º

    ´ËʵÀýµÄÒ»¸ö¸±±¾¡£

    Å׳ö£º

    CloneNotSupportedException - Èç¹û¶ÔÏóµÄÀ಻֧³Ö Cloneable ½Ó¿Ú£¬ÔòÖØд clone ·½·¨µÄ×ÓÀàÒ²»áÅ׳ö´ËÒì³££¬ÒÔָʾÎÞ·¨¸´ÖÆij¸öʵÀý¡£

<code>Æäʵclone()±»¶¨ÒåΪprotectedÊÇÓÐÔ­ÒòµÄ,ÒòΪÓÐЩʱºòijЩÀàʵÀýÎÒÃDz»Ï£ÍûÄܱ»¸´ÖÆ.ÄÇÎÒÃÇÔõôÓÃÕâ¸ö·½·¨ÄØ?ֻҪʹÓÃÒ»¸ösuper¹Ø¼ü×־͹»ÁË.ÏÂÃæÀý×Ó¿ÉÒÔ½âÊÍÇå³þclone()µÄ×÷ÓÃÓëÆäÓ÷¨:</code>
<code avrasm="" class="hljs">public class C  {     static class Strings implements Cloneable     {         private String str;         public void SetStr(String s){             this.str = s;        }        public String GetStr(){            return this.str;        }        public Object clone()throws CloneNotSupportedException{            return super.clone();        }    }    public static void main(String[] args)     {        try{            Strings str1 = new Strings();            str1.SetStr(Hello World!);            System.out.println(-----------------);            System.out.println(str1.SetStr(Hello World!););            System.out.println(str2 = (Strings)str1.clone(););            Strings str2 = (Strings)str1.clone();            System.out.println(str1:+str1.GetStr());            System.out.println(str2:+str2.GetStr());            System.out.print(print object str1:);            System.out.println(str1);            System.out.print(print object str2:);            System.out.println(str2);            System.out.println(-----------------);            System.out.println(str2.setStr(Hello!););            str2.SetStr(Hello!);            System.out.println(str1:+str1.GetStr());            System.out.println(str2:+str2.GetStr());            System.out.print(print object str1:);            System.out.println(str1);            System.out.print(print object str2:);            System.out.println(str2);            System.out.println(-----------------);            System.out.println(str1 = str2;);            str1 = str2;            System.out.print(print object str1:);            System.out.println(str1);            System.out.print(print object str2:);            System.out.println(str2);            System.out.println(-----------------);        }catch(Exception ex){            System.out.println(ex.toString());        }    }}</code>

    ÔËÐнá¹ûÈçÏ£º

<code asciidoc="" class="hljs">-----------------str1.SetStr(Hello World!);str2 = (Strings)str1.clone();str1:Hello World!str2:Hello World!print object str1:C$Strings@de6cedprint object str2:C$Strings@c17164-----------------str2.setStr(Hello!);str1:Hello World!str2:Hello!print object str1:C$Strings@de6cedprint object str2:C$Strings@c17164-----------------str1 = str2;print object str1:C$Strings@c17164print object str2:C$Strings@c17164-----------------</code>

×îÐÂÎÄÕÂ