重載overloading和覆寫overriding哪個更早執行--?? visitor幫助篇
一:問題提出
雖然我們經常寫程序用到重載和覆寫,但是很少會考慮他們的執行順序。下邊的內容就是關于,他們同時出現時
哪個先起作用:
二:問題分析
Java是"動態單分派靜態多分派語言",這個定義已經多次提起,如果你不了解這些概念,看這里"visitor模式準備"
所以就注定了重載(靜態多分派)要早于覆寫(動態單分派),因為靜態分派是編繹期實現的,動態分派是執行期實現的。
三:驗證
簡單驗證一下,順變提高記憶
?1
public
?
class
?Parent?
{
?2
????
public
?
void
?run(Object?o)
{
?3
????????System.out.println(
"
in?Parent?+param:object
"
);
?4
????}
?5
????
public
?
void
?run(
int
?i)
{
?6
????????System.out.println(
"
in?Parent?+?param:int
"
);
?7
????}
?8
}
?9
10
public
?
class
?Child?
extends
?Parent?
{
11
12
????
public
?
void
?run(Object?o)
{
13
????????System.out.println(
"
in?Child?+param:Object
"
);
14
????}
15
????
public
?
void
?run(String?str)
{
16
????????System.out.println(
"
in?Child?+?param:String
"
);
17
????}
18
????
public
?
static
?
void
?main(String[]?args)?
{
19
????????Parent?p?
=
?
new
?Child();
20
????????String?str?
=
?
new
?String();
21
????????p.run(str);
22
????}
23
}
運行結果是什么?
in Child +param:Object
inChild是確認的,但是為什么是object,而不是String,我們放入的就是String啊。
首先來分析執行過程。
定義韋類型Parent p在執行run(Str)的時候,
1,如果是先執行重載,然後是執行覆寫的過程
重載時因為找不到對應的String參數的函數,所以定位到接受父類的run(Object o)函數,
覆寫時因為傳入時父類告訴子類的對象類型是Object,所以執行run(Object o);
正是我們看到的結果,所以在Java中執行的順序是這樣的。
2,為了對比,說一下先覆寫后重載的過程
如果是先覆寫,再重載
覆寫時因為確定對象實際是子類,所以直接覆寫到Child,然後重載,發現有對應的String為參數的函數
執行,run(String str);
應該輸出的結果:in Child +param:String
但我們看到結果顯然是1,所以驗證了Java是先重載后覆寫的。
最后的部分:
看完本文,如果你對visitor模式有更多的興趣,想了解更多請看如下幾篇文章。
1,靜態分派,動態分派,多分派,單分派 --------------?? visitor模式準備
2,訪問差異類型的集合類 ------------------------?? visitor模式入門
3,visitor模式理論及學術概念-------------------?? visitor模式深入
4,visitor模式和其它模式的比較和關系-------------?? visitor模式總結?
5,重載overloading和覆寫overriding哪個更早執行--?? visitor幫助篇 (本文)
雖然排列順序是1,2,3,4,5 但是我個人建議的學習方式是2,1,3,4,5因為這個順序更方便一般人理解