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

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 肥仔 閱讀(221) 評論(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>
            亚洲一区二区网站| 亚洲一区二区三区四区五区午夜| 亚洲男女毛片无遮挡| 亚洲精品自在在线观看| 国产精品久久久久久久久久尿 | 欧美国产一区二区三区激情无套| 亚洲在线观看视频网站| 亚洲午夜在线视频| 麻豆视频一区二区| 欧美理论大片| 激情综合在线| 一区二区欧美亚洲| 久久久午夜视频| 一区二区欧美亚洲| 久久婷婷色综合| 国产精品免费视频xxxx| 尤物yw午夜国产精品视频| 最新中文字幕一区二区三区| 亚洲综合首页| 欧美大片第1页| 亚洲欧美另类中文字幕| 欧美国产视频一区二区| 国产在线视频欧美一区二区三区| 伊人成年综合电影网| 亚洲欧美国产精品专区久久| 亚洲电影中文字幕| 中日韩美女免费视频网址在线观看| 欧美在线免费观看视频| 国产一区二区在线免费观看 | 欧美激情第4页| 黄色亚洲免费| 欧美在线国产精品| 亚洲视频欧美视频| 91久久精品国产| 久久久久久网址| 在线播放国产一区中文字幕剧情欧美| 日韩亚洲欧美在线观看| 你懂的一区二区| 美国十次了思思久久精品导航| 黄色亚洲在线| 亚洲精品一区二区网址| 欧美日韩一区二区高清| 亚洲欧美一区二区三区极速播放| 一区二区三区欧美激情| 国产精品丝袜白浆摸在线| 久久嫩草精品久久久久| 欧美区国产区| 久久精品欧美日韩| 日韩午夜一区| 欧美一级视频精品观看| 亚洲三级观看| 香蕉久久一区二区不卡无毒影院| 136国产福利精品导航网址| 亚洲日本va午夜在线影院| 国产精品影片在线观看| 亚洲精品欧洲| 最新69国产成人精品视频免费| 一本不卡影院| 亚洲国产你懂的| 欧美专区中文字幕| 先锋影音久久| 欧美三级乱人伦电影| 欧美激情一区| 亚洲国产日韩欧美| 久久精品国产视频| 亚洲线精品一区二区三区八戒| 久久女同互慰一区二区三区| 久久精品九九| 精品白丝av| 久久久夜精品| 欧美日韩在线一区| 亚洲老板91色精品久久| 9人人澡人人爽人人精品| 另类尿喷潮videofree| 老司机午夜精品视频| 在线观看精品一区| 欧美成人精品在线播放| 亚洲精选在线| 欧美一区二区三区精品电影| 国产精品男女猛烈高潮激情| 国产一区二区久久| 久久久噜噜噜久久人人看| 亚洲第一级黄色片| 亚洲欧美国产一区二区三区| 国产精品久久77777| 性色一区二区| 欧美激情精品久久久久久| 一本一本久久a久久精品综合麻豆| 欧美国产亚洲精品久久久8v| 亚洲手机在线| 久久伊人亚洲| 亚洲视频第一页| 一色屋精品视频在线看| 国产精品女主播一区二区三区| 欧美主播一区二区三区| 99精品欧美一区二区蜜桃免费| 久久精品视频免费播放| 亚洲精品在线一区二区| 影视先锋久久| 国产婷婷97碰碰久久人人蜜臀| 免费欧美网站| 久久99伊人| 亚洲一区影音先锋| 亚洲一区二区在线| 亚洲校园激情| 一区二区三区www| 亚洲夫妻自拍| 欧美成人蜜桃| 国产精品一区二区久激情瑜伽| 欧美 日韩 国产一区二区在线视频| 欧美一区二区三区免费大片| 亚洲清纯自拍| 亚洲午夜久久久久久久久电影网| 亚洲美女一区| 亚洲小说欧美另类婷婷| 性欧美xxxx大乳国产app| 亚洲欧美日韩一区二区在线| 欧美一区二区三区四区高清| 亚洲一区二区在线看| 久久本道综合色狠狠五月| 久久精品道一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 欧美福利影院| 国产资源精品在线观看| 亚洲第一在线综合在线| 亚洲每日在线| 久久疯狂做爰流白浆xx| 欧美bbbxxxxx| 欧美一区久久| 欧美视频在线视频| 尤物九九久久国产精品的分类| 亚洲人成网站色ww在线| 欧美在线播放一区二区| 乱中年女人伦av一区二区| 亚洲九九九在线观看| 亚洲欧美国产制服动漫| 欧美国产欧美综合| 韩日成人av| 亚洲免费视频观看| 亚洲精品日韩在线观看| 久久久之久亚州精品露出| 国产日产高清欧美一区二区三区| 最新成人av网站| 欧美不卡福利| 狂野欧美激情性xxxx欧美| 好看的日韩视频| 久久免费高清| 久久综合国产精品台湾中文娱乐网 | 久久午夜激情| 午夜在线电影亚洲一区| 欧美午夜久久| 亚洲专区在线| 性欧美video另类hd性玩具| 国产精品三级视频| 久久精品九九| 久久久久久色| 99国产精品| 亚洲一区中文字幕在线观看| 国产精品久久久久久妇女6080 | 欧美性视频网站| 久久久91精品国产| 久久亚洲精品中文字幕冲田杏梨| 国产一区二区三区的电影| 免费在线亚洲| 欧美日韩在线视频一区二区| 久久国产精品一区二区三区四区| 久久综合国产精品| 中国女人久久久| 久久久久久久一区二区| 日韩亚洲欧美在线观看| 欧美一区二区久久久| 亚洲欧洲另类| 性色一区二区| 亚洲视频专区在线| 亚洲欧美另类在线| 99国产精品国产精品久久| 久久久天天操| 久久久999成人| 国产精品国产亚洲精品看不卡15| 久久综合中文色婷婷| 国产欧美综合一区二区三区| 亚洲人成网站在线观看播放| 在线欧美视频| 欧美亚洲一级| 久久久久久久综合日本| 国产精品黄色在线观看| 日韩一级不卡| 国产精品99久久不卡二区| 欧美日韩精品一区| 亚洲国产精品成人综合| 狠狠色狠狠色综合日日五| 欧美一级日韩一级| 欧美一区亚洲二区| 国产农村妇女毛片精品久久莱园子 | 久久亚洲精品一区| 欧美午夜免费电影| 久久国产精品久久久久久| 最新国产の精品合集bt伙计| 久久综合伊人77777蜜臀| 久久久精品国产免大香伊|