2012-02-26 100 views
0

爲什麼「Hi1」和「Hi3」按以下代碼顯示兩次?需要輸出的解釋

static int a=1; 
public static void main(String[] args) {    
    if (a==2) { System.out.println(args[0]); a = 3;} 
    if (a==1) { main(); }  
    System.out.println("Hi1"); 
    System.out.println(new PlayingWithMain().main("Hi3")); 
} 
public static void main() { 
    a = 2; 
    String[] a = new String[10]; 
    a[0] = "Hi2"; 
    main(a); 
} 
String main(String s) { 
    return s; 
} 

我剛開始準備參加OCPJP考試。

+1

只需用筆和紙追蹤執行情況。 (該代碼是可怕的btw。) – Mat 2012-02-26 15:37:01

+0

或者你可以使用任何IDE,如eclipse,netbeans等調試該程序。它會幫助你更容易理解。 – 2012-02-26 15:40:53

回答

2

第一課—或技巧,這取決於你怎麼看它這個問題的—是,只有一個main方法是特殊的,不管main方法多少都存在。特殊的一個是一個的形式爲

public static void main(/* multiple arguments */) { ... } 

在過去,參數必須是String[] args,但最近的版本,無功ARG遊戲也是可以接受的(例如String... args)。 JLS 12.1.4

現在我們知道以哪種方法開始,我們看到第一行檢查值爲a。我們看到它已初始化爲1,因此我們可以忽略a==2行。然後,在下一行中,我們跳轉到無參數main

在無參數main中,a設置爲2.下一課是方法 - 局部變量可以隱藏類變量。一個新的a被聲明,並且它在該方法內部優先,但只要該方法一直存在。它是一個大小爲10的字符串數組,但只有第一個被設置(「Hi2」)。在這個方法中還有一個教訓:這段代碼是爲了讓你認爲string-arg main接下來被調用,但它沒有,因爲我們沒有創建一個對象,它不是static。相反,我們回到main(String[] args)

這一次,a是2 —記住,我們將它的無參數mainastatic這樣的變化支左右—所以我們打印的第一個參數,「HI2。」接下來,我們將a設置爲3,所以即將到來的a==1測試失敗。在下面的行,我們打印「HI1」首次開創PlayingWithMain,我認爲一個新的實例是,整個代碼片段家住類。

由於astatic,其價值甚至保持3爲新的對象。但是,由於該對象正在呼叫main("Hi3"),因此我們不會去static版本的main;相反,我們轉到string-arg main。該方法只是將輸入返回給調用者,並立即打印出來。

這對於string-array-arg main是這樣,所以我們回到調用它的方法,no-arg main。它也完成了,所以我們再次回到JVM調用的main(String[] args)版本。請記住,我們剛剛完成該行

if (a==1) { main(); } 

因此我們再次打印「Hi1」。最後,我們重複最後一行,它會創建另一個新的PlayingWithMain對象,並最後一次打印「Hi3」。

0

main(String [])調用main(),它再次調用main(String []),如果a == 1,在開始時爲true。

一個變量是用來使這個遞歸只發生一次而不是無止境的。

這就是main(String [])方法執行兩次的原因,這就是爲什麼從該方法寫入的輸出出現兩次。

+0

如果按照流程進行操作,控制將首先轉到main(),因爲== 1表示爲true,然後返回到main(String [] args),現在a == 2的計算結果爲true,Hi2顯示Hi1和Hi3後顯示。據我所說,代碼執行應該在這裏結束。但我仍然無法弄清楚爲什麼會顯示最後的Hi1和Hi3。 – 2012-02-26 18:39:52