• <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>

            woaidongmao

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

            深入 JAVA對象的復(fù)制與比較

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

            1.對象的復(fù)制

             

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


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

            例如:

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

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


            例如:

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


            a. "=="
                if(p1 == p2)...
              
            此次測試的是對象引用, 其結(jié)果肯定是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() 方法, 但它只是比較兩個對象引用, 而非比較兩個對象實(shí)例.
                
            不管怎樣, 如果需要比較Pupil 類的對象(例如要將它們放入對象容器), 應(yīng)該為Pupil 類重定義equals() 方法:

            1.    
            2.     public boolean equals(Object otherobj) {
            3.         //檢查otherobj 是否為空
            4.         if(otherobj == null) return false;
            5.  
            6.         //檢查otherobj 是否就是當(dāng)前對象
            7.         if(otherobj == this) return true;
            8.  
            9.         //檢查otherobj 是否具有正確的類型, 即檢查是否可與當(dāng)前對象比較
            10.         if(!(otherobj instanceof Pupil)) return false;
            11.  
            12.         //otherobj 轉(zhuǎn)換為Pupil 類的對象引用
            13.          Pupil tmpObj = (Pupil)otherobj;
            14.         //關(guān)于學(xué)生是否相等的邏輯檢查
            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() 方法. 一般來說, 用戶自己定義的類也應(yīng)當(dāng)提供合適的equals() 方法, 特別是當(dāng)程序要將其對象放入JAVA API 所提供的對象容器類的時候
               
            按照約定, 任何類所提供的equals() 方法所實(shí)現(xiàn)的相等比較應(yīng)該是等價關(guān)系, 即滿足自反性, 對稱性和傳遞性. 另外一個類重定義了equals() 方法, 也應(yīng)該重定義相應(yīng)hashCode() 方法, 否則將這個類的對象放入映射對象容器時也會發(fā)生以外.

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

            久久天天躁狠狠躁夜夜2020| 亚洲中文字幕久久精品无码喷水| 久久婷婷国产麻豆91天堂| 精品久久久久久无码人妻蜜桃 | 99热热久久这里只有精品68| av色综合久久天堂av色综合在| 亚洲国产精品18久久久久久| 久久综合伊人77777麻豆| 久久久久久久久久久久久久| 色综合合久久天天给综看| 亚洲国产精品一区二区久久| 国内精品九九久久久精品| 久久久久久久波多野结衣高潮| 国产精品99久久99久久久| 久久久久亚洲爆乳少妇无| 久久综合香蕉国产蜜臀AV| 久久精品一本到99热免费| 69久久精品无码一区二区| 香蕉久久夜色精品升级完成| 欧美精品一本久久男人的天堂| 亚洲国产成人精品女人久久久| 久久天堂AV综合合色蜜桃网 | 日日狠狠久久偷偷色综合免费| AV无码久久久久不卡蜜桃| 国产成人香蕉久久久久| 亚洲午夜久久久久久噜噜噜| 久久99精品九九九久久婷婷| 久久亚洲美女精品国产精品| 亚洲午夜福利精品久久| 国产香蕉久久精品综合网| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久99精品国产一区二区三区| 99久久综合狠狠综合久久止| 亚洲午夜久久久| 办公室久久精品| 久久精品无码一区二区三区| 久久精品成人欧美大片| 亚洲国产成人精品女人久久久 | 99久久国产综合精品网成人影院 | 精品伊人久久久| 久久成人18免费网站|