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

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>
            欧美日韩成人一区| 国产偷久久久精品专区| 亚洲成人原创| 欧美国产综合| 国产精品视频成人| 久久婷婷麻豆| 欧美日韩亚洲一区| 午夜亚洲视频| 美女国内精品自产拍在线播放| 99国产精品99久久久久久粉嫩| 亚洲欧美日韩国产中文| 日韩午夜三级在线| 亚洲欧美在线高清| 夜夜爽99久久国产综合精品女不卡| 午夜精品视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美在线视频观看| 亚洲综合久久久久| 欧美性猛交视频| 国产一区二区电影在线观看| 亚洲高清色综合| 国产欧美日韩亚洲一区二区三区| 亚洲国产精品传媒在线观看| 亚洲国产精品久久久久婷婷884 | 欧美国产精品人人做人人爱| 国产精品二区影院| aa亚洲婷婷| 一二三区精品| 欧美日韩中文字幕在线视频| 亚洲国产欧美一区| 亚洲国产精品成人精品| 久久综合网络一区二区| 欧美激情aⅴ一区二区三区| 在线日韩日本国产亚洲| 一本色道久久综合精品竹菊 | 99精品欧美一区二区蜜桃免费| 欧美一区二区三区视频在线观看| 午夜精品视频在线观看| 国产一区二区精品在线观看| 久久久av毛片精品| 亚洲国产婷婷| 欧美一区二区视频在线观看| 亚洲经典自拍| 久热精品视频在线免费观看| 亚洲精品日产精品乱码不卡| 国产精品99一区二区| 欧美一二三视频| 日韩一区二区福利| 蜜臀99久久精品久久久久久软件 | 亚洲自拍都市欧美小说| 久久久久久夜精品精品免费| 欧美一区三区二区在线观看| 欧美国产综合| 久久久久成人精品| 亚洲一区二区免费在线| 亚洲第一福利在线观看| 欧美体内she精视频| 欧美韩日一区二区| 久久久一二三| 久久视频在线免费观看| 亚洲欧美影院| 在线综合亚洲| 亚洲在线一区二区| aa级大片欧美三级| 一区二区欧美日韩| 99re在线精品| 在线亚洲国产精品网站| 99在线|亚洲一区二区| 欧美大片在线看| 久久在精品线影院精品国产| 快播亚洲色图| 麻豆91精品91久久久的内涵| 久久精品99| 免费亚洲电影在线| 亚洲国内精品| 艳妇臀荡乳欲伦亚洲一区| 中文精品视频一区二区在线观看| 制服丝袜亚洲播放| 久久国产精品久久久久久久久久| 久久九九国产精品| 欧美激情女人20p| 国产精品久久一区二区三区| 国产精品网站在线| 亚洲电影激情视频网站| 亚洲精选久久| 久久疯狂做爰流白浆xx| 亚洲免费观看高清在线观看 | 在线综合视频| 久久精品av麻豆的观看方式 | 狠狠色噜噜狠狠色综合久 | 亚洲裸体在线观看| 亚洲一区二区三区中文字幕在线| 久久精品国产清高在天天线 | 国产日韩欧美综合| 在线观看成人一级片| 午夜影视日本亚洲欧洲精品| 男女精品视频| 久久国产黑丝| 国产综合色在线| 欧美一区二区视频免费观看| 欧美激情精品久久久久久免费印度 | 亚洲区国产区| 欧美大片在线影院| 欧美激情视频一区二区三区免费| 免费一级欧美在线大片| 久久福利资源站| 最新国产精品拍自在线播放| 一区二区日本视频| 久久久夜精品| 国产亚洲欧美日韩精品| 亚洲视频播放| 亚洲第一网站| 久久九九国产精品怡红院| 欧美性猛交xxxx乱大交蜜桃 | 免费欧美网站| 国内精品伊人久久久久av一坑 | 欧美一级视频免费在线观看| 久久五月天婷婷| 久久久人人人| 亚洲免费观看| 香蕉久久一区二区不卡无毒影院| 国自产拍偷拍福利精品免费一| 欧美日韩一区在线| 亚洲国产欧美不卡在线观看| 蜜桃av一区二区| 欧美成人精品1314www| 日韩视频在线一区| 亚洲在线免费| 亚洲高清久久久| 亚洲国产网站| 国产在线精品成人一区二区三区| 免费观看成人| 欧美日韩中文字幕在线视频| 久久久国产视频91| 欧美日本在线视频| 另类春色校园亚洲| 欧美日韩国产麻豆| 国产精品日日摸夜夜摸av| 亚洲精品九九| 欧美国产三区| 一区二区三区黄色| 欧美在线免费视屏| 韩国v欧美v日本v亚洲v| 亚洲麻豆国产自偷在线| 亚洲精品国产欧美| 欧美精品三级日韩久久| 亚洲激情在线| 亚洲精品美女久久7777777| 久久精品国产久精国产爱| 亚洲一区免费观看| 欧美美女喷水视频| 欧美大片18| 在线欧美一区| 久久久久久一区二区| 麻豆精品精华液| 黑丝一区二区三区| 久久久视频精品| 亚洲三级电影全部在线观看高清| 日韩午夜在线| 国产精品亚洲第一区在线暖暖韩国| 久久久久国产一区二区| 国产视频欧美视频| 麻豆精品视频在线| 一本色道88久久加勒比精品| 欧美在线999| 亚洲成色精品| 欧美日韩在线视频首页| 亚洲一区久久久| 美女被久久久| 欧美一区影院| 欧美一区二区在线免费观看| 欧美一区三区三区高中清蜜桃| 国产日韩欧美三区| 狼狼综合久久久久综合网 | 亚洲欧美另类国产| 国产精品综合久久久| 欧美伊人久久大香线蕉综合69| 蜜臀av在线播放一区二区三区 | 蜜臀av一级做a爰片久久| 亚洲尤物在线| 亚洲视频自拍偷拍| 日韩一区二区免费高清| 亚洲国产另类精品专区| 亚洲国产成人在线| 日韩视频在线一区二区| 亚洲图片你懂的| 亚洲欧美日韩一区二区| 欧美一区二区三区免费视频| 亚洲一区免费视频| 精品1区2区| 国产精品一区二区女厕厕| 欧美激情一区二区三区蜜桃视频| 亚洲婷婷综合久久一本伊一区| 免费一级欧美片在线播放| 午夜精品视频在线| 欧美中文字幕视频| 欧美在线在线| 久久久精品国产免大香伊 | 亚洲在线视频| 亚洲一品av免费观看|