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

          1.對(duì)象的復(fù)制


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

          淺復(fù)制: 只復(fù)制復(fù)合對(duì)象本身.
          深復(fù)制: 除了復(fù)制復(fù)合對(duì)象本身, 還復(fù)制了復(fù)合對(duì)象的引用的對(duì)象實(shí)例.

          例如:
          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.         //此時(shí)newClass 與aClass 指向同一塊內(nèi)存
          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.         //此時(shí)newClass 與aClass 的相應(yīng)sno , name 指向同一塊內(nèi)存
          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.         //完全的復(fù)制
          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 進(jìn)行復(fù)制
          兩個(gè)必須條件:
          1.一定要將重定義后的clone() 方法定義為公有方法(在Object 類(lèi)中, 它是受保護(hù)的成員,    不能直接使用)
          2.該后代類(lèi)聲明實(shí)現(xiàn)接口 Cloneable 接口(當(dāng)類(lèi)實(shí)現(xiàn)該接口, 其任何子類(lèi)也會(huì)繼承該接口), 該接口實(shí)際上沒(méi)有任何
            內(nèi)容, 只是一個(gè)標(biāo)識(shí), 標(biāo)志實(shí)現(xiàn)該接口的類(lèi)提供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.重寫(xiě)Object.clone()
          例如對(duì)   private char[] cb; character buffer 進(jìn)行復(fù)制
            
          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.復(fù)制數(shù)組
            數(shù)組是在方法調(diào)用重以引用的形式傳遞的對(duì)象. 下述情況下非常適合引用來(lái)傳遞數(shù)組:
            *正在接收的方法不修改數(shù)組
            *正在調(diào)用的方法不必關(guān)心是否修改數(shù)組
            *正在調(diào)用的方法想要得到數(shù)組中的修改結(jié)果 
            否則, 就應(yīng)該在方法調(diào)用中傳遞數(shù)組對(duì)象的副本. 只需調(diào)用 arrObj.clone() 方法即可完成數(shù)組arrObj 的復(fù)制操作. 隨后將該數(shù)組副本強(qiáng)制轉(zhuǎn)換為其正確類(lèi)型:
                (type[])arrObj.clone();
             System.arraycopy 方法提供一種用于在數(shù)組間復(fù)制多個(gè)元素的有效方式.
                  System.arraycopy(source, i, target, j, len)

          3.對(duì)象實(shí)例的比較


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

          a. "==" 
             if(p1 == p2)...
            此次測(cè)試的是對(duì)象引用, 其結(jié)果肯定是false, 只要兩個(gè)對(duì)象引用不是互為別名就不會(huì)相等.
          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 的跟類(lèi)Object 也提供了equals() 方法, 但它只是比較兩個(gè)對(duì)象引用, 而非比較兩個(gè)對(duì)象實(shí)例.
              不管怎樣, 如果需要比較Pupil 類(lèi)的對(duì)象(例如要將它們放入對(duì)象容器), 應(yīng)該為Pupil 類(lèi)重定義equals() 方法:
          1.    
          2.     public boolean equals(Object otherobj) {
          3.         //檢查otherobj 是否為空
          4.         if(otherobj == nullreturn false;
          5.         //檢查otherobj 是否就是當(dāng)前對(duì)象
          6.         if(otherobj == thisreturn true;
          7.         //檢查otherobj 是否具有正確的類(lèi)型, 即檢查是否可與當(dāng)前對(duì)象比較
          8.         if(!(otherobj instanceof Pupil)) return false;
          9.         //將otherobj 轉(zhuǎn)換為Pupil 類(lèi)的對(duì)象引用
          10.         Pupil tmpObj = (Pupil)otherobj;
          11.         //關(guān)于學(xué)生是否相等的邏輯檢查
          12.         if(sno.equals(tmpObj.sno) && name.equals(tmpObj.name)
          13.              && age == tmpObj.age) return true;
          14.         
          15.         return false;
          16.     }

             JAVA API 所提供的每個(gè)類(lèi)幾乎都提供了采用深比較策略的equals() 方法, 例如String 類(lèi)equals() 方法. 一般來(lái)說(shuō), 用戶自己定義的類(lèi)也應(yīng)當(dāng)提供合適的equals() 方法, 特別是當(dāng)程序要將其對(duì)象放入JAVA API 所提供的對(duì)象容器類(lèi)的時(shí)候.  
             按照約定, 任何類(lèi)所提供的equals() 方法所實(shí)現(xiàn)的相等比較應(yīng)該是等價(jià)關(guān)系, 即滿足自反性, 對(duì)稱(chēng)性和傳遞性. 另外一個(gè)類(lèi)重定義了equals() 方法, 也應(yīng)該重定義相應(yīng)hashCode() 方法, 否則將這個(gè)類(lèi)的對(duì)象放入映射對(duì)象容器時(shí)也會(huì)發(fā)生以外.

          FeedBack:

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 绩溪县| 岚皋县| 新干县| 凤阳县| 上林县| 开远市| 淳化县| 龙山县| 阜新市| 饶河县| 赣榆县| 乌恰县| 兴义市| 调兵山市| 宁安市| 白河县| 天台县| 冀州市| 华容县| 探索| 梁山县| 唐海县| 莒南县| 营山县| 克什克腾旗| 武宁县| 拉萨市| 鄂托克前旗| 梓潼县| 泸定县| 江孜县| 安康市| 苗栗县| 威信县| 桐梓县| 苍山县| 泗阳县| 木里| 金昌市| 凭祥市| 舞阳县|