亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

解答大家大部分疑惑

我也是小白,面對大家大部分問題,這是我的見解:(有點啰嗦)

首先要明白,重寫的equals方法中有多個return,只要執行一個,方法中剩下的語句就不會執行

1、contains()方法的實質:假設有一個集合L:{A,B,C},其中A,B,C三個對象都是Course類型的,每個對象都有兩個屬性:id和name?,F在集合L調用contains方法,來判斷某個對象e是否在這個集合內:L.contains(e);它的執行過程是,系統自動讓集合中的每一個對象調用一次equals方法,即A.equals(e),B.equals(e),C.equals(e),只要這三個equals方法有一個返回TRUE,則contains方法就返回TRUE,證明對象e 存在集合中。所以重寫equals方法,就是重寫contains方法

2、第一個if(this==obj)意為,是不是對象調用equals方法來和自己比較,自己和自己比較當然相同啦,結果返回TRUE,然后執行權回到主方法中

3、第二個if(obj==null)意為:被比較的對象obj是不是空的,由于只有非空對象才能調用equals方法,所以若obj是空對象,則結果肯定是FALSE

4、第三個if(!(obj instanceof Course))和下面強制類型轉換,意為,判斷被比較對象obj的實例是不是Course類型的。這里的被比較對象使我們在主方法中創建的一個Course對象(Course obj=new Course();),我們只給它賦予了一個屬性name,注意此對象的引用叫obj,他是Course類型的,這個對象的實例叫new Course();他也是Course類型的。然后這個obj被當做形參傳給contains方法,這里向上轉型object類,也就是說隱形的執行了一句:(Object)obj,這里改變類型的只是對象的引用obj(其類型從Course變成Object),實例依然是Course類型的,所以用instanceof關鍵字(他判斷的是實例的類型),判斷其類型應為Course類的。然后我們要用到這個對象的屬性,由于此時對象的引用是object所以,還得再把它變回來。

這里給大家舉個例子:有一個人叫小明,他的媽媽叫小紅,有一件事只有叫小明的人才能干。這個人就相當于一個對象,他的名字小明就相當于對象的引用,她的媽媽是小紅相當于對象的實例,即:無論這個人叫小明也好,該名稱小剛也罷,他都是小紅的兒子,這點是不變的(對應程序中的向上轉型成object,實例依然為Course類型),然而我們要讓一個人做什么事,肯定會說:“那個誰誰誰,你去干什么什么……”,我們用的是這個人的名字,也就是這個對象的引用,由于文中提到有一件事只有叫小明的人才能做,所以即使人還是這個人,但他的名字已經叫小剛了,不叫小明了,所以還得把他的名字換回來(對應程序的強制類型轉換)

5、if(this.name.equals(course.name))為什么用equals,而不用“==”。首先注意,這里調用equals方法的主體是this.name 他是個string類型的變量,而我們重寫的是Course類型的equals方法,所以這里不是equals方法的遞歸。第二點,一個內存中只能存放一種內容,然而相同的內容可以存在于多個內存之中,也就是說同內存肯定同內容,但同內容不一定同內存?!?=”比較的是內存是否相同,而equals比較的是內容,this.name和course.name這兩個分別是不同對象的屬性,而不同對象肯定不同內存,所以用“==”的話無論怎樣都會返回FALSE。


正在回答

7 回答

equals源碼是用==寫的,而==在比較引用類型的時候比較的是對象的內存地址,即是否為同一對象,是就返回true,這里重寫equals為實現比較引用對象的內容(如題即比較的是id和書名)

1 回復 有任何疑惑可以回復我~

第一點應該是判斷兩個引用對象的值是否相等,就是判斷他們的地址是否相等

0 回復 有任何疑惑可以回復我~

第5點說到點上了,我就想知道equals方法內部的equals是不是該重寫equals的方法遞歸

根據就近原則,只要方法名一樣,方法參數一樣,就調用該方法,顯然這里的不是方法的遞歸,那調用的就是String類的equals方法

0 回復 有任何疑惑可以回復我~

老妹 寫的太復雜了。。

0 回復 有任何疑惑可以回復我~

this==obj不是自己和自己比較

第4點太羅嗦啦

第5點不就是比較String嗎,太羅嗦啦

0 回復 有任何疑惑可以回復我~

太啰嗦了,有這么復雜嗎??

equals 的源碼就是在比較內存地址

重寫就是為了不是比較內存地址


0 回復 有任何疑惑可以回復我~

我就是樓主

3 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Java入門第三季
  • 參與學習       409766    人
  • 解答問題       4543    個

Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧

進入課程

解答大家大部分疑惑

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號