為什麼多型呼叫方法必須在執行時才能確定,難道在編譯的時候無法確定到底引用的是哪個方法嗎?

時間 2021-05-09 21:20:53

1樓:喬冬

實現多型的機制:父類或介面定義的引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是記憶體裡正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。

因為在編譯期不會分配記憶體空間,更不會建立例項物件,所以父類引用無法確定指向那個物件的方法。

2樓:

因為class檔案的編譯過程不包含傳統編譯中的連線步驟,一切的方法呼叫在class檔案裡面儲存的都是符號引用,在類載入解析階段,如果能確定真正呼叫的方法是哪個物件的,並且執行期不會改變,那麼這些符號引用會轉換成直接引用。比如靜態方法,私有方法,例項構造器,父類方法,final方法。也就是非虛方法。

這些在編譯期就能完全確定。以上為解析呼叫,而對於非解析呼叫,也就是分派呼叫,那要確定目標方法,某些情況下就需要確定方法的接收者的實際型別是什麼,但實際型別是執行期可知的。

PS:分派呼叫還比較複雜,還涉及到什麼靜態分派,動態分派,單分派和分派,不寫了。

3樓:DoYourThink

我有10個兒子,過年的時候,每個人都會給我帶禮物,他們說禮物都準備好了,

可是,我不知道,過年的時候,到底能來幾個兒子,我今年,到底可以收幾個禮物呢?

過年了,才知道~~~

4樓:張砸鍋

題主所說子型別多型只是多型的一種形態而已。想想黎克特制替換原則。你的類呼叫乙個介面的實現,如果我在執行過程中替換為另乙個實現,你的類在編譯時刻如何知道我替換後的是哪個類?

C ,C ,Lua在執行時,各自都做了什麼?

徐波 c 的IL是一種標準,微軟的所有.net語言,諸如vb,f 等都可以編譯為IL,所以虛擬機器寫一套就可以。lua的虛擬機器為自己優化,沒法通用 首先,你要明白JIT是做什麼的,這玩意兒就是把某種位元組碼編譯成機器碼,然後直接呼叫執行。因此本質上就是個翻譯器。既然是翻譯器,那麼自然用什麼語言寫都...

Windows 單次執行時間久了為什麼會卡?

不是CPU和記憶體的問題,是硬碟的問題。WIN10用的時候會往虛擬記憶體裡寫東西,特別是在記憶體占用高的情況下,所以讀取的時候很卡。而且一般來說,睡眠後這個問題會更加明顯。下次你卡的時候你開啟任務管理器看一下,硬碟必100 固態還好,機械隨機讀取的時候也就幾M每秒,你那台1T的機械必然是最卡的。我的...

為什麼 2G RAM 的 6S 執行時,剩餘記憶體依然不到 200 MB?

洋芋燉土豆 現在最大的問題就是,ios開始卡了,很多人給出的都是安卓機的答案或者是 不可能 事實就放在那裡,最近幾個月開始很卡,感覺是記憶體邏輯有bug了 Sirius丶白狼 蘋果系統是屬於預先占領一大部分記憶體去處理軟體執行快取等等,就算4g記憶體開機後也剩不下多少可用空間。跟安卓機制不同,安卓是...