JAVA-初步认识-第十一章-object类-equals方法覆盖
一.
現(xiàn)在要談?wù)揺quals方法另一個(gè)方面。如果不寫equals方法,直接用==來(lái)比較也是可以的,貌似equals方法有點(diǎn)多余。
現(xiàn)在不比較對(duì)象是否相等,而是比較對(duì)象中的特定內(nèi)容,比如說(shuō)對(duì)象的年齡,之前的寫法如下
其實(shí)這個(gè)方法寫完后,本類中還是具備equals方法,因?yàn)樗^承了object類,所有類都是繼承根類的。(無(wú)論寫還是不寫extends object)
compare和equals都是比較對(duì)象,只不過(guò)側(cè)重點(diǎn)不一樣,兩者有些重復(fù)。既然對(duì)象自身具備著是否相同的功能,我們就沒(méi)有必要再重新定義了。借用比較的功能,但是對(duì)其內(nèi)容進(jìn)行復(fù)寫。
有人寫成下面的情況,這就不是復(fù)寫,這是你自己定義的一個(gè)功能。這是重載,而不是復(fù)寫。
我們不想比較地址值,想要比較年齡,默認(rèn)比較的是return this==obj;我們改成下面這樣的。
?
現(xiàn)在來(lái)檢驗(yàn)一下
為什么會(huì)出錯(cuò)呢?傳遞進(jìn)來(lái)的類中沒(méi)有age成員變量,為什么呢?就在于equals方法中的形參是equals類型,原先p2是person類型,這樣自動(dòng)提升了類型稱為了equals類型,就失去了特有數(shù)據(jù),限制了功能。
你想要進(jìn)行擴(kuò)展性的應(yīng)用,你就需要運(yùn)用多態(tài)的形式,而多態(tài)一用,就會(huì)隱藏子類型。因?yàn)?#xff0c;它們都會(huì)向上轉(zhuǎn)型。貓一旦變成動(dòng)物,你想調(diào)用它抓老鼠就很難了。但是還想用,就要想到怎么向下轉(zhuǎn)型。
編譯運(yùn)行的結(jié)果也是真的。
我們知道,如果我們不覆蓋這個(gè)方法的話,它就是假,因?yàn)榈刂分挡灰粯印N覀円坏└采w了的話,建立的是年齡比較。
接下來(lái),我們放入的是Demo類,如下所示,(但是其中Demo類中,沒(méi)有任何東西,沒(méi)有age,那么貌似無(wú)法比較)
編譯結(jié)果如上,Demo不能被轉(zhuǎn)成person,向上提升類型可以,但是向下強(qiáng)轉(zhuǎn)是不行的,因?yàn)閺腄emo類到person類是行不通的。它接收的范圍很廣,但是用的時(shí)候只有一個(gè)。這時(shí)候需要做健壯性判斷。
寫成上面這樣有些不太合適,不同類型也是可以輸入,不行的話,給個(gè)false結(jié)果。意味著豬也可以和人進(jìn)行比較,即使種類差別很大。所以,我們說(shuō)只有同類型才可以進(jìn)行比較,不同類型咱就別比了。非同類型,就讓你掛掉,不僅僅是給個(gè)false,而是拋出一個(gè)異常的回復(fù)。retunrn false只用來(lái)表示同類型,成員變量不相等。那么拋出異常時(shí),是拋出編譯異常,還是運(yùn)行時(shí)異常。(我覺(jué)著編譯還是可以,而且程序無(wú)法識(shí)別輸入的到底是什么,只有在運(yùn)行輸入數(shù)據(jù)時(shí),才能判別出有錯(cuò)誤)
視頻中講解到,拋出編譯異常是拋不出去的,要拋出去的話,需要object obj=p2這個(gè)聲明。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/wsw-bk/p/7854343.html
總結(jié)
以上是生活随笔為你收集整理的JAVA-初步认识-第十一章-object类-equals方法覆盖的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 无序数组及其子序列的相关问题研究
- 下一篇: zsh 每次打开Terminal都需要s