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

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

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

    java世界
    有些人注定要生活在彼岸,可以親近可以愛憐,甚至可以窮盡一生去思念,只是無法觸及有些距離,注定不能跨越只能倆倆相望,就像有些愛只能養在心里長在眼中,不能捧在手里放在身邊,注定只能邂逅無法遭遇!
    posts - 12,comments - 15,trackbacks - 0
    1.對象的復制
    2.clone()的使用
    3.對象實例的比較
    ////////////////////////////

    1.對象的復制


    1.    
    2. String str1 = "This is a string!"  //這里是 "對象引用" 的復制
    3. String str2 = new String(str1);  //這里是 "對象實例" 的復制

    淺復制: 只復制復合對象本身.
    深復制: 除了復制復合對象本身, 還復制了復合對象的引用的對象實例.

    例如:
    1. class Pupil{
    2.     public Pupil(String sno, String name, int age){
    3.         this.sno = new String(sno);
    4.         this.name = new String(name);
    5.         this.age = age;
    6.     }
    7.     public String getSno() {
    8.         return sno;
    9.     }
    10.     public String getName() {
    11.         return name;
    12.     }
    13.     public int getAge() {
    14.         return age;
    15.     }
    16.     public void setAge(int age) {
    17.         this.age = age;
    18.     }
    19.     private String sno;
    20.     private String name;
    21.     private int age;
    22. }
    23. public class CopyDemo {
    24.     public static Pupil[] shallowCopy(Pupil[] aClass) {
    25.         Pupil[] newClass = new Pupil[aClass.length];
    26.         //此時newClass 與aClass 指向同一塊內存
    27.         for(int i=0; i<aClass.length; i++)
    28.             newClass[i] = aClass[i];
    29.         return newClass;
    30.     }
    31.     
    32.     public static Pupil[] deepCopy(Pupil[] aClass) {
    33.         Pupil[] newClass = new Pupil[aClass.length];
    34.         //此時newClass 與aClass 的相應sno , name 指向同一塊內存
    35.         for(int i=0; i<aClass.length; i++) {
    36.             String sno = aClass[i].getSno();
    37.             String name = aClass[i].getName();
    38.             int age = aClass[i].getAge();
    39.             newClass[i] = new Pupil(sno, name, age);
    40.         }
    41.         return newClass;
    42.     }
    43.     public static Pupil[] deeperCopy(Pupil[] aClass) {
    44.         Pupil[] newClass = new Pupil[aClass.length];
    45.         //完全的復制
    46.         for(int i=0; i<aClass.length; i++) {
    47.             String sno = new String(aClass[i].getSno());
    48.             String name = new String(aClass[i].getName());
    49.             int age = aClass[i].getAge();
    50.             newClass[i] = new Pupil(sno, name, age);
    51.         }
    52.         return newClass;
    53.     }
    54. }


    2.clone()的使用


    * Object.clone()
    * Cloneable 接口
    * CloneNotSupportedException

    a. 使用Object.clone 進行復制
    兩個必須條件:
    1.一定要將重定義后的clone() 方法定義為公有方法(在Object 類中, 它是受保護的成員,    不能直接使用)
    2.該后代類聲明實現接口 Cloneable 接口(當類實現該接口, 其任何子類也會繼承該接口), 該接口實際上沒有任何
      內容, 只是一個標識, 標志實現該接口的類提供clone() 方法.(這是接口的一種非典型用法)
    1. public class Fraction implements Cloneable {
    2.     public Object clone() {
    3.         try{
    4.             return super.clone();  //call protected method
    5.         } catch (CloneNotSupportedException e) {
    6.             return null;
    7.         }
    8.     }
    9.     //other methods ...
    10. }


    b.重寫Object.clone()
    例如對   private char[] cb; character buffer 進行復制
      
    1. // add in class Cirbuf
    2.         public Object clone() {
    3.         try{
    4.             Cirbuf copy = (Cirbuf)super.clone();
    5.             copy.cb = (char[])cb.clone();
    6.             return copy;
    7.         }catch (CloneNotSupportedException e){
    8.             throw new InternalError(e.toString());
    9.         }
    10.     }

    c.復制數組
      數組是在方法調用重以引用的形式傳遞的對象. 下述情況下非常適合引用來傳遞數組:
      *正在接收的方法不修改數組
      *正在調用的方法不必關心是否修改數組
      *正在調用的方法想要得到數組中的修改結果 
      否則, 就應該在方法調用中傳遞數組對象的副本. 只需調用 arrObj.clone() 方法即可完成數組arrObj 的復制操作. 隨后將該數組副本強制轉換為其正確類型:
          (type[])arrObj.clone();
       System.arraycopy 方法提供一種用于在數組間復制多個元素的有效方式.
            System.arraycopy(source, i, target, j, len)

    3.對象實例的比較


    例如:
    1.     Pupil p1 = new Pupil("99184001""zhang3", 18);
    2.     Pupil p2 = new Pupil("99184001""zhang3", 18);

    a. "==" 
       if(p1 == p2)...
      此次測試的是對象引用, 其結果肯定是false, 只要兩個對象引用不是互為別名就不會相等.
    b. 淺比較  false
    1.    if(p1.getSno() == p2.getSno() && p1.getName() == p2.getName()
    2.      && p1.getAge() == p2.getAge()) ...;

    c. 深比較   true[/code]   
      if(p1.getSno().equals(p2.getSno()) && p1.getName().equals(p2.getName())
         && p1.getAge() == p2.getAge()) ...;[/code]
        JAVA API 的跟類Object 也提供了equals() 方法, 但它只是比較兩個對象引用, 而非比較兩個對象實例.
        不管怎樣, 如果需要比較Pupil 類的對象(例如要將它們放入對象容器), 應該為Pupil 類重定義equals() 方法:
    1.    
    2.     public boolean equals(Object otherobj) {
    3.         //檢查otherobj 是否為空
    4.         if(otherobj == nullreturn false;
    5.         //檢查otherobj 是否就是當前對象
    6.         if(otherobj == thisreturn true;
    7.         //檢查otherobj 是否具有正確的類型, 即檢查是否可與當前對象比較
    8.         if(!(otherobj instanceof Pupil)) return false;
    9.         //將otherobj 轉換為Pupil 類的對象引用
    10.         Pupil tmpObj = (Pupil)otherobj;
    11.         //關于學生是否相等的邏輯檢查
    12.         if(sno.equals(tmpObj.sno) && name.equals(tmpObj.name)
    13.              && age == tmpObj.age) return true;
    14.         
    15.         return false;
    16.     }

       JAVA API 所提供的每個類幾乎都提供了采用深比較策略的equals() 方法, 例如String 類equals() 方法. 一般來說, 用戶自己定義的類也應當提供合適的equals() 方法, 特別是當程序要將其對象放入JAVA API 所提供的對象容器類的時候.  
       按照約定, 任何類所提供的equals() 方法所實現的相等比較應該是等價關系, 即滿足自反性, 對稱性和傳遞性. 另外一個類重定義了equals() 方法, 也應該重定義相應hashCode() 方法, 否則將這個類的對象放入映射對象容器時也會發生以外.
    posted on 2005-11-17 09:47 安德爾斯 閱讀(962) 評論(1)  編輯  收藏

    FeedBack:

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


    網站導航:
     
    主站蜘蛛池模板: 日本免费在线中文字幕| 日本免费精品一区二区三区| 久久久久国色av免费看 | 成年人视频在线观看免费| 亚洲成a人片毛片在线| 最近免费中文字幕高清大全| 亚洲五月六月丁香激情| 91av免费观看| 亚洲宅男精品一区在线观看| 妞干网手机免费视频| 精品在线观看免费| 国产精品亚洲综合一区| a级成人免费毛片完整版| 亚洲综合一区二区精品导航| 亚洲免费视频观看| 亚洲欧洲无码一区二区三区| 国产成人免费手机在线观看视频| 免费国产污网站在线观看不要卡| 亚洲欧洲精品成人久久曰影片| a级毛片无码免费真人久久| 91亚洲国产成人精品下载| 两个人的视频高清在线观看免费 | 亚洲一区二区三区首页| 99无码人妻一区二区三区免费| 亚洲人成未满十八禁网站| 亚洲AV日韩精品一区二区三区 | 一级毛片视频免费| 亚洲av色影在线| 成年性羞羞视频免费观看无限 | 中文在线观看永久免费| 亚洲欧洲国产日韩精品| 成年女人午夜毛片免费看| GOGOGO高清免费看韩国| 亚洲日韩国产精品无码av| 免费萌白酱国产一区二区| 在线观看免费播放av片| 亚洲人成网国产最新在线| 亚洲线精品一区二区三区| 国产v精品成人免费视频400条| 大片免费观看92在线视频线视频| 久久精品国产亚洲av成人|