2012-04-10 107 views
2

這裏是我的代碼:爲什麼`main`在這裏被調用兩次?

public class Test 
{ 
    static 
    { 
     main(null); 
    } 
    public static void main(String [] args) 
    { 
     System.out.println("done"); 
    } 
} 

我得到以下輸出:

done 
done 

有人可以請解釋我這樣做的原因是什麼?

+1

請閱讀[this](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)。 – mre 2012-04-10 20:14:41

回答

3

您認爲什麼不尋常?該static塊被執行一次時,類裝載(和它具有執行main方法之前被加載然後main方法本身執行

檢查出這個修改版本:

public class Test { 
    static { 
     main(new String[]{"[done static]"}); 
    } 

    public static void main(String[] args) { 
     System.out.println(args.length > 0 ? args[0] : "[done]"); 
    } 
} 

它打印:

[done static] 
[done] 
+0

我們傳遞null作爲主要方法存在於static中的參數,它應該是字符串 – 2012-04-10 20:19:57

+0

我只是因靜態塊內main方法中存在null參數而感到困惑,請告訴我會說它會產生任何問題,因爲主要方法期望一個字符串類型作爲參數 – 2012-04-10 20:28:10

+0

@saurabhRai:'main'方法需要'String ** **數組**,而不是'String'。另外'null'不是很正確,因爲'main'方法總是由JVM提供參數數組 - 如果沒有參數,這個數組是空的,但不是'null'。 – 2012-04-10 20:30:12

6

的原因是main被調用兩次:

  1. 明確,從static initialization block一旦類被加載。
  2. 隱含地,一旦程序啓動就立即進入程序。

如何解決這個問題?要麼不明確地調用它,要麼重命名它,以便它不會被自動調用。

1

當第一次加載類時,會調用類的靜態塊。這是第一次完成。第二個是因爲你正在運行程序,然後調用main方法。

+0

無論你告訴我,我知道,但問題是,我們傳遞null作爲靜態主要方法中的參數,它應該有一些字符串 – 2012-04-10 20:17:29

+0

由於您沒有使用傳遞給main的參數,它並不重要,你是什麼傳遞給主要方法。它只會被調用。 – 2012-04-10 20:25:27

+0

謝謝,最後你提供了我正在尋找的解決方案 – 2012-04-10 20:31:53

2

由於

  • 當類Test在JVM(它是一種靜態構造的)
  • 而執行開始時,main方法被稱爲內部加載的static { ... }部分被調用。
1

主要是通過在加載罐虛擬機自動調用,所以這是第一個「完成」,正常的切入點Java程序

012。

第二個'完成'是因爲您在靜態類初始化程序中顯式調用它而編寫的。一旦虛擬機類加載器加載類,就會調用添加到「Test」類中​​的「靜態」部分。

應該從靜態初始化程序甚至在入口點Main被調用之前調用它,因爲在調用入口點之前需要加載類。

1

在調用Test.main之前,JVM需要通過運行其靜態初始化程序來初始化Test類。此電話是第一次致電main()。初始化完成後,JVM再次調用main(),最終生成您看到的輸出。

1

Main由JVM自動調用。不需要在靜態部分中調用它。

public class Test 
{ 
    public static void main(String [] args) 
    { 
     System.out.println("done"); 
    } 
} 

上面的代碼是它應該是。

相關問題