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