解答大家大部分疑惑
我也是小白,面對大家大部分問題,這是我的見解:(有點啰嗦)
首先要明白,重寫的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。
2017-07-05
equals源碼是用==寫的,而==在比較引用類型的時候比較的是對象的內存地址,即是否為同一對象,是就返回true,這里重寫equals為實現比較引用對象的內容(如題即比較的是id和書名)
2019-06-07
第一點應該是判斷兩個引用對象的值是否相等,就是判斷他們的地址是否相等
2018-04-20
第5點說到點上了,我就想知道equals方法內部的equals是不是該重寫equals的方法遞歸
根據就近原則,只要方法名一樣,方法參數一樣,就調用該方法,顯然這里的不是方法的遞歸,那調用的就是String類的equals方法
2018-03-12
老妹 寫的太復雜了。。
2017-07-14
this==obj不是自己和自己比較
第4點太羅嗦啦
第5點不就是比較String嗎,太羅嗦啦
2017-06-27
太啰嗦了,有這么復雜嗎??
equals 的源碼就是在比較內存地址
重寫就是為了不是比較內存地址
2017-06-24
我就是樓主