<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    大魚

    Equals探索

                Equals探索

                                              

    第一節:eqauls 與 = =之異同

    1)比較方式角度:

    = =是面向過程的操作符;equals是面向對象的操作符

    = =不屬于任何類,equals則是任何類(在Java中)的一個方法;

    我們可以1)Primitive1 (基本類型)= = Primitive2(基本類型);

             2)Object Reference1(對象引用)= = Object Reference2(對象引用)

             3)Object Reference1 (對象引用) .equals(Object Reference2 (對象引用))

               這三種比較

               但卻不能Primitive1 (基本類型).equals( Primitive2(基本類型));

     對于基本類型,沒有面向對象中發送消息一說,自然也不會有

    方法成員。

     

    2)比較目的角度:

    1)    如果要比較兩個基本類型是否相等,請用= =;

    2)    如果要比較兩個對象引用是否相等,請用= =;

    3)    如果要比較兩個對象(邏輯上)是否一致,請用equals;

     

    第二節:對兩個對象(邏輯上)是否一致的闡釋:

       有人會問:在C++中, 比較兩個對象相等不是也可以用==嗎?我知道您是指運算符重載,但是很遺憾,Java中不支持運算符重載(java中亦有重載過運算符,他們是“+”,“+=”,不過也僅此兩個,而且是內置實現的);所以,對象的是否相等的比較這份責任就交由  equals()來實現 。   

    這個“邏輯上”其實就取決于人類的看法,實際開發中,就取決于用戶的需求;

    有人會有看法:“取決于人類的看法”太過寬泛和不嚴肅,如果某人要兩件

    風牛馬不相及的事物也相等,equals是否也能作出這樣的比較呢?我們說可以的

    下面這個例子說明了這一點:

     

    class Horse {

           String Type;

           int Legs;

      //相等的標準:腿的數目相等

           public boolean equals(Object o){

              if(this.Legs==((Cattle)o).Legs){

                 return true;

              }

           return false;

    }

    public Horse(String Type,int legs){

               this.Type=Type;

            this.Legs=legs;

    }

          

    }

     

     

    class Cattle

    {

        String Type;

           int  Legs;

         //相等的標準:腿的數目相等

            public Cattle(String Type,int legs){

               this.Type=Type;

            this.Legs=legs;

           }

           public boolean equals(Object o){

              if(this.Legs==((Horse)o).Legs){

                 return true;

              }

           return false;

           }

     

    }

     

    public class EqualsTest{

    public static void main(String[] args)

           {  

               Cattle c=new Cattle("I'm the Cattle",4);

                Horse h=new Horse("I'm the Horse",4);

               if(c.equals(h)){

                     System.out.println(c.Type);

                     System.out.println(h.Type);

                    System.out.println("Cattle Equals Horse");

                }

           }

    }

     

    輸出結果:"I'm the Cattle"

              "I'm the Horse"

              "Cattle Equals Horse"

    您瞧瞧:牛果真等于了馬,為何相等?因為我們定義的相等標準是:腿的數目相等;您會說:“這太滑稽”,是滑稽,可這是人類的看法,計算機可沒有滑稽的概念,當然也沒有“不滑稽”的概念,我們定義了什么相等標準,他就踏踏實實的為我們實現了;

     所以說:相等標準(即需求)一定要定好,否則,滑稽的事可就多了

    第三節:equals()緣起:

            equals()是每個對象與生俱來的方法,因為所有類的最終基類就是Object(除去Object本身);而equals()是Object的方法之一。

            我們不妨觀察一下Object中equals()的source code:

             public boolean equals(Object obj) {

                          return (this == obj);

              }

            注意 “return (this == obj)”

            this與obj都是對象引用,而不是對象本身。所以equals()的缺省實現就是比較

            對象引用是否一致;為何要如此實現呢? 前面我們說過:對象是否相等,是由我們的需求決定的,世界上的類千奇百怪(當然,這些類都是我們根據模擬現實世界而創造的),雖然Object是他們共同的祖先,可他又怎能知道他的子孫類比較相等的標準呢?但是他明白,任何一個對象,自己總是等于自己的,何謂“自己總是等于自己”呢,又如何判斷“自己總是等于自己”呢?一個對象在內存中只有一份,但他的引用卻可以有無窮多個,“對象自己的引用1=對象自己的引用2”,不就能判斷“自己總是等于自己”嗎?所以缺省實現實現自然也就是

            “return (this == obj)”;

            而到了我們自己編寫的類,對象相等的標準由我們確立,于是就不可避免的要覆寫

            繼承而來的public boolean equals(Object obj);

            如果您有過編覆寫過equals()的經驗(沒有過也不要緊),請您思考一個問題:

             “兩個對象(邏輯上)是否一致”實際上是比較什么?沒錯,或許您已脫口而出:

           就是對象的屬性(即field,或稱數據成員)的比較。方法是不可比較的哦。(這個問題是不是有些弱智呢?哈哈)

     第四節:對一個推論的思考

    推論如下:一言以蔽之:欲比較棧中數據是否相等,請用= =;

                          欲比較堆中數據是否相等,請用equals;

    因為(根)基本類型,(根)對象引用都在棧中; 而對象本身在堆中;

             這句話又對又不對,問題出在哪,就是“數據”二字,先看棧中,數據或為基本類型,或為對象引用,用==比較當然沒錯;但是堆中呢?對象不是堆中嗎?不是應該用equals比較嗎?可是,我們比較的是堆中“數據”,堆中有對象,對象由什么構成呢?可能是對象引用,可能是基本類型,或兩者兼而有之。如果我們要比較他們,該用什么呢,用”equals()”?不對吧,只能是”= =”!所以正確的結論是:欲比較棧中數據是否相等,請用= =; 欲比較堆中數據是否相等,請用equals;

    因為(根)基本類型,(根)對象引用都在棧中(所謂“根”,指未被任何其他對象所包含); 而對象本身在堆中。

     

    posted on 2009-03-15 21:44 大魚 閱讀(124) 評論(0)  編輯  收藏 所屬分類: j2se

    主站蜘蛛池模板: 四虎影视永久免费观看| 亚洲免费综合色在线视频| 免费少妇a级毛片| 色窝窝亚洲AV网在线观看| 大地资源二在线观看免费高清 | 久久www免费人成精品香蕉| 国产乱弄免费视频| 美女视频黄视大全视频免费的| 国产精品麻豆免费版| 特级无码毛片免费视频| 亚洲伊人成无码综合网| 99热在线日韩精品免费| 亚洲欧洲精品无码AV| 国产激情免费视频在线观看| 666精品国产精品亚洲| 亚洲免费在线视频观看| 亚洲大成色www永久网址| 天堂在线免费观看中文版| 久久精品熟女亚洲av麻豆 | 国产精一品亚洲二区在线播放| 99久久国产精品免费一区二区 | 亚洲国产精品日韩在线观看| 最近免费中文字幕视频高清在线看 | 91视频国产免费| 色窝窝亚洲av网| 久久精品国产亚洲沈樵| 在线观看成人免费视频不卡| 一本色道久久88亚洲精品综合| 四虎在线播放免费永久视频| 三年在线观看免费观看完整版中文| 亚洲av无码乱码国产精品| 成人免费看片又大又黄| CAOPORM国产精品视频免费| 久久久久亚洲AV片无码下载蜜桃| 一二三四免费观看在线电影| 黄网站在线播放视频免费观看| 亚洲精品无码不卡在线播HE| 免费99精品国产自在现线| 一本久久免费视频| 亚洲成a人不卡在线观看| 亚洲?v无码国产在丝袜线观看|