青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

深入 JAVA對象的復制與比較

1.對象的復制
2.clone()
的使用
3.
對象實例的比較
////////////////////
//
/////////////////////

1.對象的復制

 

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


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

例如:

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

 

2.clone()的使用


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

a.
使用Object.clone 進行復制
兩個必須條件:
1.
一定要將重定義后的clone() 方法定義為公有方法(Object 類中, 它是受保護的成員,     不能直接使用)
2.
該后代類聲明實現接口 Cloneable 接口(當類實現該接口, 其任何子類也會繼承該接口), 該接口實際上沒有任何
  
內容, 只是一個標識, 標志實現該接口的類提供clone() 方法.(這是接口的一種非典型用法)

  1.  
  2. public class Fraction implements Cloneable {
  3.     public Object clone() {
  4.         try{
  5.             return super.clone();  //call protected method
  6.          } catch (CloneNotSupportedException e) {
  7.             return null;
  8.          }
  9.      }
  10.     //other methods ...
  11. }



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.  
  2.      Pupil p1 = new Pupil("99184001", "zhang3", 18);
  3.      Pupil p2 = new Pupil("99184001", "zhang3", 18);


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

  1.  
  2.    if(p1.getSno() == p2.getSno() && p1.getName() == p2.getName()
  3.       && 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 == null) return false;
  5.  
  6.         //檢查otherobj 是否就是當前對象
  7.         if(otherobj == this) return true;
  8.  
  9.         //檢查otherobj 是否具有正確的類型, 即檢查是否可與當前對象比較
  10.         if(!(otherobj instanceof Pupil)) return false;
  11.  
  12.         //otherobj 轉換為Pupil 類的對象引用
  13.          Pupil tmpObj = (Pupil)otherobj;
  14.         //關于學生是否相等的邏輯檢查
  15.         if(sno.equals(tmpObj.sno) && name.equals(tmpObj.name)
  16.               && age == tmpObj.age) return true;
  17.         
  18.         return false;
  19.      }


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

posted on 2009-08-24 23:34 肥仔 閱讀(222) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品成人一区二区三区吃奶| 在线免费观看一区二区三区| 亚洲欧美日韩在线综合| 亚洲午夜一区二区三区| 国产精品视频大全| 久久一日本道色综合久久| 久久网站热最新地址| 亚洲欧洲在线观看| 亚洲伦理在线免费看| 国产精品视频一二三| 老牛国产精品一区的观看方式| 蜜桃av一区二区| 中文国产亚洲喷潮| 亚洲尤物视频在线| 在线播放日韩| 日韩西西人体444www| 国产欧美精品在线播放| 老司机亚洲精品| 欧美日本一区二区三区| 亚欧美中日韩视频| 乱中年女人伦av一区二区| 亚洲一区二区三区四区在线观看| 免费一级欧美片在线观看| 亚洲一区二区免费| 久久精品国产亚洲一区二区三区| 亚洲日韩欧美视频一区| 亚洲一区尤物| 亚洲国产精品成人综合| 中日韩在线视频| 激情五月综合色婷婷一区二区| 亚洲三级电影在线观看| 欧美三区美女| 久久一区二区精品| 欧美日韩一区二区三区免费| 久久久久久国产精品一区| 欧美精品久久久久久久免费观看 | 欧美午夜精品久久久久久人妖| 欧美在线一区二区三区| 女女同性精品视频| 久久se精品一区精品二区| 欧美成人国产一区二区| 欧美与欧洲交xxxx免费观看 | 欧美激情一区二区三区成人| 国产精品久久久久久av福利软件| 免费看精品久久片| 国产精品久久久久久久久久三级| 欧美ed2k| 国产欧美日韩免费| 亚洲国产影院| 国语自产精品视频在线看8查询8| 亚洲麻豆国产自偷在线| 在线成人激情| 亚洲欧美日韩国产一区二区| 99热这里只有成人精品国产| 久久精品免费| 欧美福利视频在线| 99精品欧美一区| 久久久欧美一区二区| 亚洲欧美日韩精品一区二区| 另类尿喷潮videofree| 欧美自拍偷拍| 欧美天天综合网| 亚洲国产成人高清精品| 国产自产在线视频一区| 亚洲视频一区在线| 99精品久久久| 免费影视亚洲| 久久综合网hezyo| 国产精品美女久久久免费| 亚洲精品综合精品自拍| 亚洲青涩在线| 久久久人人人| 久久精品视频网| 国产精品成人va在线观看| 亚洲欧洲在线播放| 亚洲欧洲日产国产网站| 久久久www成人免费毛片麻豆| 欧美一区二区三区在线观看| 欧美日韩在线不卡| 亚洲日本aⅴ片在线观看香蕉| 亚洲第一伊人| 久久久水蜜桃av免费网站| 久久精品一区蜜桃臀影院| 国产精品亚洲美女av网站| 夜夜爽av福利精品导航| 一区二区精品| 欧美日韩国产精品| 亚洲精品久久久久中文字幕欢迎你 | 在线看成人片| 久久精品观看| 久久综合99re88久久爱| 欧美中文字幕第一页| 国产精品视频专区| 亚洲一区二区三区色| 亚洲欧美日本日韩| 国产精品久久二区| 亚洲视频中文字幕| 亚洲永久免费av| 国产精品高潮呻吟久久| 亚洲深夜影院| 午夜精品久久久久久久| 国产精品视区| 亚洲欧美一区二区在线观看| 欧美在线短视频| 国产视频一区二区在线观看 | 先锋影音网一区二区| 欧美一区二区视频网站| 国产日韩欧美夫妻视频在线观看| 午夜精品一区二区三区四区| 久久精品道一区二区三区| 国产亚洲成年网址在线观看| 久久aⅴ国产紧身牛仔裤| 久久综合狠狠综合久久综青草| 国产日韩欧美91| 久久久久女教师免费一区| 免费久久99精品国产| 1024欧美极品| 欧美福利网址| 在线一区二区三区做爰视频网站| 亚洲在线黄色| 国产欧美一区二区视频| 欧美有码视频| 久久精品国产一区二区电影| 激情视频一区| 欧美大色视频| 一个色综合av| 午夜免费日韩视频| 国模套图日韩精品一区二区| 老司机精品久久| 亚洲精品一区二区三区不| 亚洲欧美亚洲| 黑人极品videos精品欧美裸| 久久久噜噜噜| 国产精品卡一卡二卡三| 欧美专区亚洲专区| 欧美激情国产日韩| 在线一区二区三区四区五区| 国产精品久久久久高潮| 久久九九有精品国产23| 亚洲国产视频直播| 亚洲一区二区三区涩| 国产日韩亚洲欧美| 理论片一区二区在线| 夜夜爽99久久国产综合精品女不卡| 欧美一区二区三区久久精品| 在线观看日韩av先锋影音电影院| 欧美精品 国产精品| 亚洲免费在线观看视频| 嫩草国产精品入口| 亚洲一级黄色| 黄色av成人| 欧美日韩成人综合天天影院| 午夜精品在线| 亚洲国产日韩精品| 欧美在线观看视频在线| 亚洲人成高清| 国产精品欧美日韩一区二区| 久久嫩草精品久久久精品| 亚洲精品久久久一区二区三区| 欧美一区三区二区在线观看| 最新国产拍偷乱拍精品| 国产精品美女久久久久av超清| 久久五月激情| 亚洲一区二区三区在线看| 欧美高清在线视频观看不卡| 亚洲女同精品视频| 亚洲风情在线资源站| 国产精品久久看| 久久精品首页| 中文欧美在线视频| 欧美国产日韩xxxxx| 午夜精品影院| 亚洲精选在线观看| 国产一区二区三区自拍| 欧美日韩在线观看一区二区三区 | 亚洲人成网站在线观看播放| 国产精品视频xxx| 亚洲第一综合天堂另类专| 狠狠色丁香婷婷综合| 欧美午夜精品| 六十路精品视频| 欧美一区二区三区四区视频| 亚洲久色影视| 老司机久久99久久精品播放免费 | 一色屋精品视频在线观看网站| 欧美视频一区二区三区…| 久久亚洲精品一区| 午夜亚洲福利| 一区二区三区www| 亚洲第一综合天堂另类专| 久久性色av| 欧美亚洲系列| 亚洲视频国产视频| 亚洲人在线视频| 激情国产一区| 国产日韩欧美视频在线| 欧美日韩免费在线| 欧美第十八页| 久久综合色天天久久综合图片| 欧美一级视频|