HelloWorld 是每個 Java 開發者的起點,但這 5 行代碼蘊含了 Java 語言設計哲學、編譯模型、運行時架構的核心秘密。本文從「為什麼一切從類開始」「為什麼 main 必須是 static」「字節碼長什麼樣」「JVM 如何加載並執行」四個維度,層層剖析這個經典程序的完整生命週期。
Java 是純面向對象語言:
這是 Java「一切皆對象」設計決策的直接體現(基本類型除外,但有包裝類)。
public static void main(String[] args) { ... }
Class.getMethod("main", String[].class)String[] args:接收命令行參數,支持啟動時配置注入
Class 文件以 CA FE BA BE 魔數開頭,後接版本號、常量池、類/接口/字段/方法/屬性表。
> javap -c HelloWorld
public class HelloWorld extends java.lang.Object {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String "Hello World"
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
Constant pool:
#1 = Methodref #6.#15 // java/lang/Object."<init>":()V
#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #18 // "Hello World"
#4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #21 // HelloWorld
#6 = Class #22 // java/lang/Object
...
#18 = Utf8 "Hello World"
#19 = Class #26 // java/io/PrintStream
#20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V
...
#2 → Fieldref → System.out 字段引用#3 → String 常量 "Hello World"| 指令 | 操作 | 棧變化 |
|---|---|---|
aload_0 |
將局部變量表[0]引用壓棧(this) | → [ref] |
invokespecial #1 |
調用實例初始化方法 Object.<init> |
[ref] → [] |
getstatic #2 |
獲取靜態字段 System.out 引用 |
→ [PrintStream] |
ldc #3 |
將常量池[3]字符串引用壓棧 | [PrintStream] → [PrintStream, String] |
invokevirtual #4 |
調用 PrintStream.println(String) |
[PrintStream, String] → [] |

JAVA_HOME/jre/lib 核心庫(rt.jar)jre/lib/ext 擴展庫CLASSPATH 用戶代碼(HelloWorld.class)雙親委派:子加載器收到請求先委派父加載器,父加載不到才嘗試自己加載。保證核心類不被篡改、單一身份。
java.lang.Class 對象(方法區)static int i=0)<clinit>(靜態塊、靜態字段賦值),HelloWorld 無靜態塊則無此步驟HelloWorld.main()main 字節碼索引 0invokevirtual #4 → 創建 println 棧幀壓入棧頂println 返回 → 棧幀出棧,返回值(void)不壓入return → main 棧幀出棧,主線程結束,JVM 退出(若無非守護線程)javap 反編譯、十六進制分析、JVM 參數調優(-XX:+TraceClassLoading 等)一個 HelloWorld,串起了 Java 技術體系的脈絡。深入理解它,是通往 JVM 專家之路的第一步。