Wayne
          井底的蛙--一直仰望著天空
          posts - 16,comments - 6,trackbacks - 0

          例:
          Friend.java
          class Friend implements Cloneable {
                     int age;
                     String name;//           StringBuffer name;
                    public Friend(int age, String name) {
                     this.age = age;
                     this.name = name; 
                    }
                    
                    public Object clone () throws CloneNotSupportedException {
                     return super.clone(); 
                    }
                     
          }

          Person.java
          class Person implements Cloneable  {
                     int age;
                    /* *
                     *String 類型特殊,因為他為引用型,而且他指向的值為常量,克隆出來的對象改變他的值
                     *實際上是改變了克隆出來對象String類型成員的指向,不會影響被克隆對象的值及其指向。
                    */
                     String name;
                    
                     Friend f;
                    
                    public Person(int age, String name, Friend f) {
                     this.age = age;
                     this.name = name;
                     this.f = f;
                    }
                    
                    //組合對象的克隆
                    public Object clone () throws CloneNotSupportedException {
                     Person p = (Person)super.clone(); //需要對每一個成員對象實現(xiàn)clone()
                     p.f = (Friend)p.f.clone();
                     return p; 
                    }
                    
                    public String toString(){
                    StringBuffer sb = new StringBuffer();
                    return super.toString()+sb.append("  age=").append(age).
                     append(",name=").append(name).
                     append("  friend=").append("f.name=").
                     append(f.name).append("f.age=").append(f.age).toString();
                   }
          }

          CloneTest.java
          import java.util.ArrayList;
          import java.util.Iterator;
          public class CloneTest {
                    public static void main(String [] args)  throws CloneNotSupportedException {
                     Person p = new Person(4,"num1",new Friend(5,"haha"));//new StringBuffer("haha")));
                     Person p1 = (Person)p.clone();
                     p1.name = "new";       //看似類似于基本類型,其實暗藏玄機
                     p1.age = 10;
                     p1.f.name = "hehe";
                     //p1.f.name = new StringBuffer("hehe");//新產(chǎn)生了一個引用,覆給了它
                     p1.f.age = 56;
                     System.out.println (p);//+"——  age"+p.age +" name "+p.name );
                     System.out.println (p1);//+"——  age"+p1.age +" name "+p1.name );
                    
                    ArrayList testList=new ArrayList();
                    testList.add(p);
                    testList.add(p1);
                    
                    System.out.println("befor testList:"+testList);
                    
                    //ArrayList的克隆
                    ArrayList newList=(ArrayList)testList.clone();        
                    //要一一走訪ArrayList/HashMap所指的每一個對象,并逐一克隆。
                    for(int i=0; i<newList.size() ; i++)
                            newList.set(i, ((Person)newList.get(i)).clone());
                    for(Iterator e=newList.iterator();e.hasNext();)
                                    ((Person)e.next()).age+=1;
                    
                    System.out.println("after: testList"+testList);
                    System.out.println("after: newList"+newList);
                    
                    }  
                    
          }


          總結(jié)

          1、基本數(shù)據(jù)類型能自動實現(xiàn)深度clone
          2、String是一個例外。
             但對于我們編程來說可以和操作基本數(shù)據(jù)類型一樣做,基本沒影響。大大方便了我們的編程。

             String類型的變量clone后的表現(xiàn)好象也實現(xiàn)了深度clone,但其實只是一個假象。
             因為執(zhí)行 p1.name = "new";語句時,它作用相當于生成了一個新的string類型,然后又賦回給p1.name。
             這是因為string被sun公司的工程師寫成了一個不可更改的類(immutable class),在所有string類中的函數(shù)都不能更改自身的值。

          ==> 這告訴我們支持更方便實現(xiàn)克隆的一種途徑:將自己定義的類編寫為不可更改。

          3、StringBuffer需要做特殊處理
             String和StringBuffer有區(qū)別。
             可以借鑒類似技巧對StringBuffer型的變量實現(xiàn)克隆效果:sb=new StringBuffer(sb.toString()); 
          posted on 2010-08-28 17:47 waynewan 閱讀(848) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 德州市| 博乐市| 嫩江县| 彰武县| 固安县| 长垣县| 乌鲁木齐县| 绥滨县| 唐山市| 普兰店市| 昌黎县| 静安区| 玉环县| 虞城县| 天全县| 岐山县| 永寿县| 大名县| 阳高县| 鄂伦春自治旗| 沅陵县| 丰县| 师宗县| 阳山县| 巩义市| 兴和县| 勐海县| 曲阜市| 南昌县| 曲沃县| 隆回县| 湖口县| 麟游县| 高淳县| 渝中区| 收藏| 巴林左旗| 灌阳县| 叙永县| 北海市| 瑞丽市|