解答大家大部分疑惑
我也是小白,面對大家大部分問題,這是我的見解:(有點(diǎn)啰嗦)
首先要明白,重寫的equals方法中有多個(gè)return,只要執(zhí)行一個(gè),方法中剩下的語句就不會(huì)執(zhí)行
1、contains()方法的實(shí)質(zhì):假設(shè)有一個(gè)集合L:{A,B,C},其中A,B,C三個(gè)對象都是Course類型的,每個(gè)對象都有兩個(gè)屬性:id和name?,F(xiàn)在集合L調(diào)用contains方法,來判斷某個(gè)對象e是否在這個(gè)集合內(nèi):L.contains(e);它的執(zhí)行過程是,系統(tǒng)自動(dòng)讓集合中的每一個(gè)對象調(diào)用一次equals方法,即A.equals(e),B.equals(e),C.equals(e),只要這三個(gè)equals方法有一個(gè)返回TRUE,則contains方法就返回TRUE,證明對象e 存在集合中。所以重寫equals方法,就是重寫contains方法
2、第一個(gè)if(this==obj)意為,是不是對象調(diào)用equals方法來和自己比較,自己和自己比較當(dāng)然相同啦,結(jié)果返回TRUE,然后執(zhí)行權(quán)回到主方法中
3、第二個(gè)if(obj==null)意為:被比較的對象obj是不是空的,由于只有非空對象才能調(diào)用equals方法,所以若obj是空對象,則結(jié)果肯定是FALSE
4、第三個(gè)if(!(obj instanceof Course))和下面強(qiáng)制類型轉(zhuǎn)換,意為,判斷被比較對象obj的實(shí)例是不是Course類型的。這里的被比較對象使我們在主方法中創(chuàng)建的一個(gè)Course對象(Course obj=new Course();),我們只給它賦予了一個(gè)屬性name,注意此對象的引用叫obj,他是Course類型的,這個(gè)對象的實(shí)例叫new Course();他也是Course類型的。然后這個(gè)obj被當(dāng)做形參傳給contains方法,這里向上轉(zhuǎn)型object類,也就是說隱形的執(zhí)行了一句:(Object)obj,這里改變類型的只是對象的引用obj(其類型從Course變成Object),實(shí)例依然是Course類型的,所以用instanceof關(guān)鍵字(他判斷的是實(shí)例的類型),判斷其類型應(yīng)為Course類的。然后我們要用到這個(gè)對象的屬性,由于此時(shí)對象的引用是object所以,還得再把它變回來。
這里給大家舉個(gè)例子:有一個(gè)人叫小明,他的媽媽叫小紅,有一件事只有叫小明的人才能干。這個(gè)人就相當(dāng)于一個(gè)對象,他的名字小明就相當(dāng)于對象的引用,她的媽媽是小紅相當(dāng)于對象的實(shí)例,即:無論這個(gè)人叫小明也好,該名稱小剛也罷,他都是小紅的兒子,這點(diǎn)是不變的(對應(yīng)程序中的向上轉(zhuǎn)型成object,實(shí)例依然為Course類型),然而我們要讓一個(gè)人做什么事,肯定會(huì)說:“那個(gè)誰誰誰,你去干什么什么……”,我們用的是這個(gè)人的名字,也就是這個(gè)對象的引用,由于文中提到有一件事只有叫小明的人才能做,所以即使人還是這個(gè)人,但他的名字已經(jīng)叫小剛了,不叫小明了,所以還得把他的名字換回來(對應(yīng)程序的強(qiáng)制類型轉(zhuǎn)換)
5、if(this.name.equals(course.name))為什么用equals,而不用“==”。首先注意,這里調(diào)用equals方法的主體是this.name 他是個(gè)string類型的變量,而我們重寫的是Course類型的equals方法,所以這里不是equals方法的遞歸。第二點(diǎn),一個(gè)內(nèi)存中只能存放一種內(nèi)容,然而相同的內(nèi)容可以存在于多個(gè)內(nèi)存之中,也就是說同內(nèi)存肯定同內(nèi)容,但同內(nèi)容不一定同內(nèi)存?!?=”比較的是內(nèi)存是否相同,而equals比較的是內(nèi)容,this.name和course.name這兩個(gè)分別是不同對象的屬性,而不同對象肯定不同內(nèi)存,所以用“==”的話無論怎樣都會(huì)返回FALSE。
2017-07-05
equals源碼是用==寫的,而==在比較引用類型的時(shí)候比較的是對象的內(nèi)存地址,即是否為同一對象,是就返回true,這里重寫equals為實(shí)現(xiàn)比較引用對象的內(nèi)容(如題即比較的是id和書名)
2019-06-07
第一點(diǎn)應(yīng)該是判斷兩個(gè)引用對象的值是否相等,就是判斷他們的地址是否相等
2018-04-20
第5點(diǎn)說到點(diǎn)上了,我就想知道equals方法內(nèi)部的equals是不是該重寫equals的方法遞歸
根據(jù)就近原則,只要方法名一樣,方法參數(shù)一樣,就調(diào)用該方法,顯然這里的不是方法的遞歸,那調(diào)用的就是String類的equals方法
2018-03-12
老妹 寫的太復(fù)雜了。。
2017-07-14
this==obj不是自己和自己比較
第4點(diǎn)太羅嗦啦
第5點(diǎn)不就是比較String嗎,太羅嗦啦
2017-06-27
太啰嗦了,有這么復(fù)雜嗎??
equals 的源碼就是在比較內(nèi)存地址
重寫就是為了不是比較內(nèi)存地址
2017-06-24
我就是樓主