2011-06-17 82 views
0

對於以下Java代碼段,「run」的方法發生四次。我對這四次「跑步」事件的關係頗感混淆。原始代碼很長,我只保留與我的問題相關的部分。關於方法覆蓋

1. public final class Job extends AbstractJob { 
    2. private Job() { 
    3. } 
    4. public static void main(String[] args) throws Exception {  
    5.   new Job().run(new Path("testdata"), output, 10); 
    6. } 
    7. 
    8. @Override 
    9. public int run(String[] args) throws IOException, ClassNotFoundException,  InterruptedException { 
    10.   run(input, output, alpha0); 
    11.   return 0; 
    12. }  
    13. public void run(Path input, Path output, double alpha0) 
    14.  throws IOException, ClassNotFoundException, InterruptedException {  
    15.  ClusterDriver.run(directoryInput, output, alpha0);  
    16. } 
    17. } 

我可以低估這段代碼的調用順序,如下所示。

起初,他在第5行的方法被調用。由於其特定的參數設置,3個參數,編譯器自動使用第13行中定義的run方法。(如果我們只有第5行中有一個參數,那麼編譯器將使用第9行中定義的run方法代替

在第9行中定義的run方法,它會調用在第10行,基本上是在13行

定義的run方法run方法是我的理解是否正確?

+1

這是關於方法*重載*,而不是*覆蓋*。是的,你的理解是正確的。 – mre

+1

你似乎並不困惑,聽起來對我來說很合適。也許你缺乏信心。 ;) –

回答

0

您的基本分析是正確的。

(只是爲了澄清,其他人提出的觀點:超載是當方法具有相同的名稱,但不同的簽名,而首要是當一個方法具有相同的名稱和參數類型爲超類的方法)

爲了將來的參考,您應該知道在Java中的方法解析(名稱+參數 - >方法選擇)在重載方法的情況下實際上可能很難理解。使用的確切行爲在Java Language Spec (JLS), section 15.12寫上去,並涉及幾個細微之處一般:

  • 重載方法分辨率爲進行編譯時,不能在運行時。 (方法中選擇覆蓋相同簽名是在運行時完成的基礎上,最具體的子類的方法)。如果編譯器知道的參數是Foo實例(例如它的類是FooFoo子類)那麼它將使用Foo作爲參數的類,而不是它的「真實」類。

  • 決定使用哪種方法的問題包括:

    • 的方法是否是可變參數與否(具有...作爲最後一個參數例如foo(Object a, String... b)
    • 的方法的是否聲明的參數是原始類型或包裹元例如float VS Float
    • 一個方法的聲明是否論據是不是另一個「更具體」(子類是比他們更超具體)

這是複雜的,但你有基本的瞭解。

2

是的,這是正確的,但這是方法超載,而不是覆蓋。

在此類中定義了兩個run方法,在第9和13行中使用不同數量的參數。因此,方法run過載。 (重寫發生,如果虛擬基類方法是在子類重新定義 - 它顯然與第9行所定義,如證明通過其註釋的方法發生,但這個起着在這個特定的問題沒有作用。)

而有兩個調用run(在第5行和第10行),這兩個調用都決定用3個參數調用該方法(在第13行定義)。

+0

+1,簡潔和正確。 – mre

0

只有最後的運行方法定義的問題。

另一運行方法(這需要String[])調用此方法,因此它的作用就像某種「代理」,而其他run調用在main方法可以選擇調用二者中的任何 - 要麼'代理'運行方法(其中需要String[] args)或最後的運行方法,它實際上是「運行」。

0

你已經得到了最正確的事情,但很少發言我要糾正是:

if we only have one parameter in line 5, then compiler will use the run method defined in line 9 instead. 

這是不完全正確的,第9行的方法接受String[]類型的參數,你將需要傳遞一個數組來調用這個方法。

For the run method defined in line 9, it will call run method at line 10, which essentially is the run method defined at line 13. 

在第10行中,您將得到語法錯誤,因爲input, output, alpha0在該方法中未定義。您需要通過String[] args參數並將其轉換爲input, output, alpha0參數,以調用run的其他實施。