關(guān)于comparable的compareTo()方法重寫(xiě)和comparator的compare(Student o1, Student o2)方法重寫(xiě)問(wèn)題

像這里,為了把Collections.sort改為按對(duì)象的ID來(lái)排序,所以重寫(xiě)compareTo方法,并且用了this.getId().compareTo(o.getId()) 語(yǔ)句,我不懂的是,這里的compareTo方法已經(jīng)重寫(xiě)為只接收Student類型的對(duì)象了,為什么它還能接收o.getId()返回的字符串類型值呢?

但是對(duì)于comparator的compare方法重寫(xiě)中,老師還是用comparable例子中compareTo那個(gè)語(yǔ)句比較并返回。但是我自己試了一下仿照compareTo那種形式用compare方法來(lái)判斷,如上圖示。這個(gè)時(shí)候編譯器報(bào)錯(cuò)了,說(shuō)是只能接收Student類型的對(duì)象,不能接收字符串。
希望有前輩可以解答一下,為什么comparable的compareTo()方法示例中,明明定義了只接收Student對(duì)象,但是在return那里還是可以接受字符串。 而在comparator的compare()方法重寫(xiě)示例中使用類似的思路寫(xiě)就會(huì)報(bào)錯(cuò)呢?
2015-09-21
首先你要了解Override的范圍!Overide只在當(dāng)前類或子類中生效!
第一個(gè)例子里,你重寫(xiě)的是Student類的compareTo()方法,那么當(dāng)你用一個(gè)Student對(duì)象去調(diào)用這個(gè)方法時(shí),執(zhí)行的就是你Student里重寫(xiě)的方法,這個(gè)你應(yīng)該是明白的。那么看方法中間的代碼,
return this.getId().compareTo(o.getId);這里的this.getId()是String類型的,而String類里的compareTo()方法并沒(méi)有重寫(xiě)!它調(diào)用的是它自身的compareTo()方法(沒(méi)有重寫(xiě)就是調(diào)用父類的)。
所以,第一個(gè)例子,同樣是compareTo()方法,一個(gè)是Student對(duì)象調(diào)用,一個(gè)是String對(duì)象調(diào)用,是調(diào)用他們各自的方法,你只是重寫(xiě)了Student里面的compareTo()方法而已。
-----------------------------------------------------------------------------------------
第二個(gè)例子里,不知道你是重寫(xiě)了那個(gè)類里的compare(),我就稱之為類Unknow。
你重寫(xiě)的Unknow類里的compareTo()方法,他只能接受Student類型的兩個(gè)參數(shù),看一下方法里面與第一個(gè)例子有和不同:return compare(o1.getId(),o2.getId()),你沒(méi)有使用對(duì)象去調(diào)用,那么java里就是當(dāng)前對(duì)象(this),也就是Unknow的對(duì)象。就像你在一個(gè)類里一個(gè)方法里調(diào)用另一個(gè)方法,都是省略了this.的。
所以,都是Unknow對(duì)象去調(diào)用compare()方法,自然調(diào)用的是你重寫(xiě)后的方法,只接受Student類型的參數(shù)。
-----------------------------------------------------------------------------------------
總而言之,你要去理解Override是怎么一回事,Overide是重寫(xiě)父類里的方法,只在當(dāng)前類或子類中生效(具體就是當(dāng)你對(duì)象調(diào)用方法,或者類調(diào)用靜態(tài)方法),而對(duì)其他類中的同名方法并不影響。還有就是方法的調(diào)用,所有的方法,都是要由對(duì)象去調(diào)用的(當(dāng)然靜態(tài)方法用類即可調(diào)用),要弄清楚是哪個(gè)類型的對(duì)象去調(diào)用了方法(特別是像上面說(shuō)的this,super隱藏了的情況)。
2016-06-12
首先可以知道compareTo這個(gè)方法的返回值是int 型,故return 這里是對(duì)兩個(gè)對(duì)象的比較而返回值 顯示了二者的大?。荒忝靼琢诉@些再按照人家說(shuō)的去領(lǐng)會(huì),會(huì)更容易
2015-09-21