public static void main(String[] args) 看似簡單,實則蘊含 JVM 啟動機制、類加載、線程模型、語法規範等核心知識。本文精選 10 道經典面試題,逐層剖析背後原理,助你在面試中游刃有餘。
答案:Java 7 之前可行,Java 7 及以後不可行。
解析:早期可利用靜態初始化塊 static { ... } 執行邏輯,JVM 在類初始化階段會執行它。但 Java 7 修改了啟動邏輯,強制要求入口點為 main 方法,靜態塊不再作為程式入口。
public class NoMain {
static { System.out.println("Running without main!"); System.exit(0); } // Java 6 可行
}
答案:標準簽名要求 String[],但可使用可變參數 String...(本質仍是陣列)。
解析:JVM 只識別 public static void main(String[])。String... args 編譯後等同 String[] args,運行無誤。其他類型(List<String>、Object[])均會導致 NoSuchMethodError。
答案:不能,必須是 void。
解析:JVM 規範強制入口點返回 void。若聲明 int main(...),編譯通過但運行拋出 NoSuchMethodError: main。
答案:避免實例化歧義,確保 JVM 無需構造對象即可直接調用。
解析:若非 static,JVM 需先實例化類。若構造器有參數(如 public Main(int i)),JVM 無法決定傳什麼值,產生歧義。static 方法屬於類,無需實例即可調用,消除此問題。
答案:編譯通過,運行失敗。
解析:語法合法,但 JVM 尋找入口點時只認 public static void main(String[])。缺少 static 會導致 NoSuchMethodError。
答案:可以重載,但只能有一個標準入口點被 JVM 識別。
解析:類中可定義多個名為 main 的方法(參數不同),但 JVM 僅調用標準簽名的那個。其他重載需手動調用。
public static void main(String[] args) { ... } // JVM 入口
public static void main(int args) { ... } // 重載,需手動調用
答案:不可以,必須是 public。
解析:JVM 從類外部調用 main,需 public 可見性。非 public 雖編譯通過,但 JVM 找不到入口,拋出 NoSuchMethodError。
答案:不能,static 方法屬於類,不參與多態,無法覆寫。
解析:子類定義相同簽名的 main 屬於隱藏,非覆寫。JVM 仍按類字面名稱調用對應 main,無動態分派。
答案:可以,return 正常結束 main 線程,JVM 正常退出(若無其他非守護線程)。
補充:System.exit(0) 強制終止整個 JVM;return 僅結束當前線程。
答案:可以,語法合法,但極少實際用途。
解析:public static synchronized void main(String[] args) 鎖定的是 Class 對象。由於 JVM 只啟動一個 main 線程,同步無意義。除非極罕見場景:自定義 ClassLoader 並發啟動同一類的 main(極不推薦)。
static 塊與靜態欄位賦值)。main 方法。args 由啟動命令行參數填充(空格分隔,引號處理)。main 方法是 Java 程式與 JVM 的契約入口。掌握其強制簽名、static 本質、JVM 識別機制、重載與覆寫區別,不僅能應對面試,更能深入理解 Java 程式生命週期的起點。