重載overloading和覆寫overriding哪個(gè)更早執(zhí)行-- visitor幫助篇
重載overloading和覆寫overriding哪個(gè)更早執(zhí)行--?? visitor幫助篇
一:問題提出
雖然我們經(jīng)常寫程序用到重載和覆寫,但是很少會考慮他們的執(zhí)行順序。下邊的內(nèi)容就是關(guān)于,他們同時(shí)出現(xiàn)時(shí)
哪個(gè)先起作用:
二:問題分析
Java是"動態(tài)單分派靜態(tài)多分派語言",這個(gè)定義已經(jīng)多次提起,如果你不了解這些概念,看這里"visitor模式準(zhǔn)備"
所以就注定了重載(靜態(tài)多分派)要早于覆寫(動態(tài)單分派),因?yàn)殪o態(tài)分派是編繹期實(shí)現(xiàn)的,動態(tài)分派是執(zhí)行期實(shí)現(xiàn)的。
三:驗(yàn)證
簡單驗(yàn)證一下,順變提高記憶



?2



?3

?4

?5



?6

?7

?8

?9

10



11

12



13

14

15



16

17

18



19

20

21

22

23

運(yùn)行結(jié)果是什么?
in Child +param:Object
inChild是確認(rèn)的,但是為什么是object,而不是String,我們放入的就是String啊。
首先來分析執(zhí)行過程。
定義韋類型Parent p在執(zhí)行run(Str)的時(shí)候,
1,如果是先執(zhí)行重載,然後是執(zhí)行覆寫的過程
重載時(shí)因?yàn)檎也坏綄?yīng)的String參數(shù)的函數(shù),所以定位到接受父類的run(Object o)函數(shù),
覆寫時(shí)因?yàn)閭魅霑r(shí)父類告訴子類的對象類型是Object,所以執(zhí)行run(Object o);
正是我們看到的結(jié)果,所以在Java中執(zhí)行的順序是這樣的。
2,為了對比,說一下先覆寫后重載的過程
如果是先覆寫,再重載
覆寫時(shí)因?yàn)榇_定對象實(shí)際是子類,所以直接覆寫到Child,然後重載,發(fā)現(xiàn)有對應(yīng)的String為參數(shù)的函數(shù)
執(zhí)行,run(String str);
應(yīng)該輸出的結(jié)果:in Child +param:String
但我們看到結(jié)果顯然是1,所以驗(yàn)證了Java是先重載后覆寫的。
最后的部分:
看完本文,如果你對visitor模式有更多的興趣,想了解更多請看如下幾篇文章。
1,靜態(tài)分派,動態(tài)分派,多分派,單分派 --------------?? visitor模式準(zhǔn)備
2,訪問差異類型的集合類 ------------------------?? visitor模式入門
3,visitor模式理論及學(xué)術(shù)概念-------------------?? visitor模式深入
4,visitor模式和其它模式的比較和關(guān)系-------------?? visitor模式總結(jié)?
5,重載overloading和覆寫overriding哪個(gè)更早執(zhí)行--?? visitor幫助篇 (本文)
雖然排列順序是1,2,3,4,5 但是我個(gè)人建議的學(xué)習(xí)方式是2,1,3,4,5因?yàn)檫@個(gè)順序更方便一般人理解