public static void main(String[] args) 是每位 Java 開發者寫過無數次的方法,但你是否真正理解每個關鍵字的必要性?為什麼是 static?為什麼回傳 void?參數為何是 String[]?本文將從 JVM 啟動流程、語言規格、實際操作三個維度,徹底拆解 main() 的奧秘。
java ClassName 指令。public static void main(String[]) 方法。這就是為什麼 main 必須是 static——JVM 在此階段尚未建立任何物件實例。
public static void main(String[] args)
| 修飾字 | 必要性 | 理由 |
|---|---|---|
| public | 是 | JVM 從類外部呼叫,需可見 |
| static | 是 | 無實例即可呼叫 |
| void | 是 | JVM 忽略回傳值,規格規定 |
| main | 是 | 固定進入點名稱 |
| String[] | 是 | 命令列參數標準型別 |
| args | 否 | 參數名稱可自訂(慣例用 args) |
public static void main(String[] args) throws Exception {
System.out.println("開始");
throw new Exception("測試異常");
}
JVM 會捕獲並印出堆疊追蹤,結束程式且退出碼非 0。
public class ArgDemo {
public static void main(String[] args) {
System.out.println("參數個數: " + args.length);
for (int i = 0; i < args.length; i++) {
System.out.printf("args[%d] = %s%n", i, args[i]);
}
}
}
執行:java ArgDemo 1 2 3
參數個數: 3
args[0] = 1
args[1] = 2
args[2] = 3
參數以空白分隔,含空白參數需用雙引號包裹。
public class HelloWorld2 {
static {
System.out.println("Hello World!"); // 在 main 前執行
}
public static void main(String[] args) {
System.exit(0); // 正常結束
}
}
靜態初始化區塊在類載入階段執行,早於 main。此技巧常用於程式庫初始化,但濫用會降低可讀性。
.class 位元組碼。public void main(String[] args) — 缺 static,JVM 找不到進入點。public static int main(String[] args) — 回傳非 void,編譯通過但 JVM 忽略回傳值。String[] parameters 完全合法。main,但 JVM 僅呼叫標準簽名者。args.length == 0 檢查必要參數,提供友善使用說明。main() 不只是習慣寫法,而是 JVM 與 Java 語言規格的契約。理解其背後的類載入、靜態初始化、命令列解析機制,有助於排查啟動失敗、設計可測試的啟動邏輯、優化應用程式啟動速度。下次輸入 psvm 時,心中更應清晰每個字元的使命。