ÄÚÈÝÕªÒª
ÈôÐèÐÞ¸ÄÒ»¸ö¶ÔÏó£¬Í¬Ê±²»Ïë¸Ä±äµ÷ÓÃÕߵĶÔÏ󣬾ÍÒªÖÆ×÷¸Ã¶ÔÏóµÄÒ»¸ö±¾µØ¸±±¾£¬
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>