大魚

          Equals探索

                      Equals探索

                                                    

          第一節(jié):eqauls 與 = =之異同

          1)比較方式角度:

          = =是面向過程的操作符;equals是面向?qū)ο蟮牟僮鞣?/p>

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

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

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

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

                     這三種比較

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

           對于基本類型,沒有面向?qū)ο笾邪l(fā)送消息一說,自然也不會有

          方法成員。

           

          2)比較目的角度:

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

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

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

           

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

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

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

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

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

          下面這個例子說明了這一點(diǎn):

           

          class Horse {

                 String Type;

                 int Legs;

            //相等的標(biāo)準(zhǔn):腿的數(shù)目相等

                 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;

               //相等的標(biāo)準(zhǔn):腿的數(shù)目相等

                  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");

                      }

                 }

          }

           

          輸出結(jié)果:"I'm the Cattle"

                    "I'm the Horse"

                    "Cattle Equals Horse"

          您瞧瞧:牛果真等于了馬,為何相等?因為我們定義的相等標(biāo)準(zhǔn)是:腿的數(shù)目相等;您會說:“這太滑稽”,是滑稽,可這是人類的看法,計算機(jī)可沒有滑稽的概念,當(dāng)然也沒有“不滑稽”的概念,我們定義了什么相等標(biāo)準(zhǔn),他就踏踏實(shí)實(shí)的為我們實(shí)現(xiàn)了;

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

          第三節(jié):equals()緣起:

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

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

                   public boolean equals(Object obj) {

                                return (this == obj);

                    }

                  注意 “return (this == obj)”

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

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

                  “return (this == obj)”;

                  而到了我們自己編寫的類,對象相等的標(biāo)準(zhǔn)由我們確立,于是就不可避免的要覆寫

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

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

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

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

           第四節(jié):對一個推論的思考

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

                                欲比較堆中數(shù)據(jù)是否相等,請用equals;

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

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

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

           

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

          主站蜘蛛池模板: 来凤县| 尚志市| 双辽市| 南宫市| 耿马| 广平县| 依安县| 龙海市| 上思县| 民乐县| 遵义市| 吴川市| 德格县| 荔浦县| 南澳县| 蚌埠市| 新疆| 东丽区| 故城县| 湟中县| 额敏县| 兰考县| 法库县| 岑溪市| 辽宁省| 文山县| 沁源县| 得荣县| 承德县| 茌平县| 三原县| 乌兰察布市| 宁河县| 威海市| 阆中市| 房山区| 永清县| 龙井市| 灌南县| 利辛县| 肇州县|