public static void main(String[] args) 是每個 Java 程序員寫的第一行代碼,但每個關鍵字的存在都有其必然性。本文從 JVM 啟動機制、參數傳遞、歷史沿革三個維度逐一拆解。
| 關鍵字 | 必要性 | 底層邏輯 |
|---|---|---|
public | 訪問權限最大 | JVM 在外部啟動類,需無限制訪問 |
static | 無需實例即可調用 | 程序入口階段尚未創建任何對象,JVM 直接通過類名調用 |
void | 無返回值 | Java 程序正常退出慣例為 0,異常退出用 System.exit(code),非 C/C++ 的 int main() |
main | 約定入口名 | 沿用 C 語言傳統,JVM 硬編碼查找此方法名 |
String[] args | 命令行參數數組 | 任意字面量均可表示為 String;Java 5+ 支持 String... args 可變參數語法 |
-cp 指定或 Manifest Main-Class)。static 塊、靜態字段)。public static void main(String[]) 方法。String[](無參時傳 new String[0],非 null)。method.invoke(null, (Object) argsArray) 執行用戶代碼。public class MainDemo {
public static void main(String... args) { // 可變參數等價
String[] arr = {"zhang", "li", "wang"};
MainTest.main(arr); // 直接調用另一類的 main
MainTest.sysInfo(); // 同類其他 static 方法
}
}
class MainTest {
public static void main(String[] args) {
for (String s : args) System.out.println(s);
}
public static void sysInfo() { System.out.println("call sysInfo()"); }
}
輸出:
zhang
li
wang
call sysInfo()
證明:main 只是約定入口,本質是 static 方法,可互相調用、可傳參、可重載。
new String[0],可直接 args.length 判斷。Thread.setDefaultUncaughtExceptionHandler 統一處理。main 的類,通過 java ClassName 指定啟動哪個。public static void main(String[] args) 每個字都是為了「JVM 無實例、無上下文、跨平台、可傳參」啟動 Java 程序而設計的最小必要集合。理解其本質,有助於編寫啟動腳本、單元測試入口、多模塊啟動器。