問題的發(fā)現(xiàn):今日筆者在復(fù)習(xí)Category的相關(guān)知識時,突然發(fā)現(xiàn)了一個有趣的小問題剧蹂,即當(dāng)一個類的兩個(或者更多)分類有同名的方法時,當(dāng)該方法被調(diào)用時,究竟會調(diào)用哪一個分類里的方法呢城侧?
如下圖所示:
兩個分類都有eat方法,然后創(chuàng)建Person對象彼妻,并調(diào)用該方法嫌佑,再運行一下,打印結(jié)果會是怎樣的呢侨歉?
好吧屋摇,不賣關(guān)子了,打印的結(jié)果如下:
說明調(diào)用了MS分類里的eat方法幽邓。
那為什么會調(diào)用MS分類的eat方法而不調(diào)動MT分類里的方法呢炮温?
難道是兩個類的擺放順序不同導(dǎo)致的?還是隨機調(diào)用這些分類里的同名方法牵舵?
可是我在嘗試改變分類的擺放順序和多次運行后發(fā)現(xiàn)柒啤,結(jié)果還是沒變倦挂,那到底是怎么回事呢?
在查閱了相關(guān)資料后我才弄明白這個問題担巩,原來這與類在編譯時的順序有關(guān)方援。
如下圖所示:
在Compile Sources這一欄里,我們可以看到程序編譯時要編譯的文件涛癌,可以看到MS分類是排在MT分類的后面肯骇,因此它的eat方法會覆蓋MT分類的eat方法,因此調(diào)用的eat方法是MS分類的祖很,這下真相重要大白了笛丙!不信的話,我們來驗證一下假颇。
在交換了MT和MS在Compile Sources這一欄的位置后胚鸯,我們再運行程序,最后的打印結(jié)果如下:
此時調(diào)用的是MT分類里的eat方法笨鸡!
雖然這個問題很小姜钳,或者說是一個冷門的知識點,但是在我求根溯源的過程中我還是收獲了不一樣的快樂和成就感~