<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-128  評論-55  文章-5  trackbacks-0

         現在Clone已經不是一個新鮮詞語了,伴隨著“多莉”的產生這個詞語確實很“火”過一陣子,在java中也有這么一個概念,它可以讓我們很方便的“制造”出一個對象的副本來,下面來具體看看java中的Clone機制是如何工作的?
         1. Clone&Copy
         假設現在有一個Employee對象,Employee tobby =new Employee(“CMTobby”,5000),通
    常我們會有這樣的賦值Employee cindyelf=tobby,這個時候只是簡單了copy了一下reference,cindyelf和tobby都指向內存中同一個object,這樣cindyelf或者tobby的一個操作都可能影響到對方。打個比方,如果我們通過cindyelf.raiseSalary()方法改變了salary域的值,那么tobby通過getSalary()方法得到的就是修改之后的salary域的值,顯然這不是我們愿意看到的。我們希望得到tobby的一個精確拷貝,同時兩者互不影響,這時候我們就可以使用Clone來滿足我們的需求。Employee cindy=tobby.clone(),這時會生成一個新的Employee對象,并且和tobby具有相同的屬性值和方法。
          2. Shallow Clone&Deep Clone
    Clone是如何完成的呢?Object在對某個對象實施Clone時對其是一無所知的,它僅僅是簡單地執行域對域的copy,這就是Shallow Clone。這樣,問題就來了咯,以Employee為例,它里面有一個域hireDay不是基本型別的變量,而是一個reference變量,經過Clone之后就會產生一個新的Date型別的reference,它和原始對象中對應的域指向同一個Date對象,這樣克隆類就和原始類共享了一部分信息,而這樣顯然是不利的,過程下圖所示:

     

    這個時候我們就需要進行deep Clone了,對那些非基本型別的域進行特殊的處理,例如本例中的hireDay。我們可以重新定義Clone方法,對hireDay做特殊處理,如下代碼所示:

       class Employee implements Cloneable

    {
            public Object clone() throws CloneNotSupportedException
            {
             Employee cloned = (Employee) super.clone();
          cloned.hireDay = (Date) hireDay.clone()
          return cloned;
            }
    }

    3. Clone()方法的保護機制
    在Object中Clone()是被申明為protected的,這樣做是有一定的道理的,以Employee
    類為例,通過申明為protected,就可以保證只有Employee類里面才能“克隆”Employee對象,原理可以參考我前面關于public、protected、private的學習筆記。
    4. Clone()方法的使用
    Clone()方法的使用比較簡單,注意如下幾點即可:
    a. 什么時候使用shallow Clone,什么時候使用deep Clone,這個主要看具體對象的域是什么性質的,基本型別還是reference variable
    b. 調用Clone()方法的對象所屬的類(Class)必須implements Clonable接口,否則在調用Clone方法的時候會拋出CloneNotSupportedException。


    Author: orangelizq
    email: orangelizq@163.com

    歡迎大家訪問我的個人網站 萌萌的IT人
    posted on 2007-10-17 14:52 桔子汁 閱讀(3170) 評論(3)  編輯  收藏 所屬分類: J2SE

    評論:
    # re: Java clone() 2007-10-17 23:46 | zhrb
    講的很清楚,幫忙頂一下。呵呵...  回復  更多評論
      
    # re: Java clone() 2008-01-23 11:58 | hello
    受益非淺!謝謝lz  回復  更多評論
      
    # re: Java clone()[未登錄] 2010-05-20 23:49 | Jim
    好文章必須頂  回復  更多評論
      
    主站蜘蛛池模板: 亚洲大码熟女在线观看| 国产一级a毛一级a看免费人娇| 日本二区免费一片黄2019| 黄色a级片免费看| 亚洲第一AAAAA片| 18禁超污无遮挡无码免费网站国产 | 亚洲网站免费观看| 中文字幕亚洲精品无码| 亚洲一级特黄大片无码毛片| 老汉精品免费AV在线播放| 成人精品国产亚洲欧洲| 久久亚洲AV成人无码国产| 四虎永久在线精品免费观看地址| 13小箩利洗澡无码视频网站免费| 亚洲色欲色欲www| 国产成人麻豆亚洲综合无码精品| 亚洲一区二区三区免费在线观看| 国产成人va亚洲电影| 亚洲欧洲春色校园另类小说| 亚洲女同成人AⅤ人片在线观看| 无遮免费网站在线入口| 一本到卡二卡三卡免费高| 97久久国产亚洲精品超碰热| 亚洲人成图片小说网站| 国产小视频免费观看| 亚州免费一级毛片| 99精品视频免费| 国产成人 亚洲欧洲| 成人免费毛片内射美女-百度| 日本一区二区三区免费高清在线 | 国产麻豆剧传媒精品国产免费 | 最近中文字幕大全中文字幕免费| 国产成人亚洲精品91专区高清| 亚洲春色在线观看| 亚洲国产精品一区二区第一页| 全部免费毛片在线| 在线免费观看一区二区三区| 131美女爱做免费毛片| 国产午夜精品久久久久免费视 | 亚洲人成电影在在线观看网色 | 亚洲av无码日韩av无码网站冲 |