個人理解,僅供參考。如果有更好的說明,可以指導一下我:
首先搞清楚一點:編譯,不是指我們在IDEA之類的工具上把代碼寫好就是編譯了。——有點難受,我自己一直把這兩個搞混,一直糊塗的以為寫代碼就是在編譯。
編譯:編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
方法重載可以根據方法簽名在編譯時就判斷出調用的是什么方法,方法簽名:方法名,方法參數(參數個數,參數類型,參數次序)
而方法重寫和向上轉型在編譯時是不能判斷調用哪個方法的。向上轉型中,對象調用的方法涉及到了方法重寫(向上轉型說明有繼承,繼承就可以重寫父類的方法)。向上轉型的方法調用的判斷機制簡單來說是,先根據調用的方法的方法簽名到父類中找到這個方法,再看子類中是否重寫了這個方法,如果子類重寫了,就調用子類的,沒有重寫就還是調用父類的。
我剛開始認為:向上轉型的調用方法當你代碼完成的時候不是可以判斷出到底調用的是哪個方法嘛?為什么說它是運行時才能判斷,這個時候我自己都能判斷出來,編譯器會不知道?。
回答:那你是怎么知道的呢?是代碼擺在你面前,你看都不看就知道了還是看了代碼之后再在腦中想了一下才知道?看和想的這個過程就可以認為程序已經在你腦中運行過一次了——它會怎么運行,出現什么結果。
而編譯器僅僅只是把你寫的代碼編程了電腦能識別的語言,這個時候電腦還沒看代碼呢。運行的時候,電腦才看代碼(二進制),可以這么理解一下。
也或許我就只是說了一些廢話,但是突然就來個點靈感才寫的這篇博客,我以前也對這個很懵逼,可能沒表達清楚吧,希望可以給到你們一點小幫助。
以下來自復制:
Java中實現多態的機制是什么?
靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。