同一個包下可以有無數個包含 main 方法的類,但單次運行只能執行一個。這是 Java 設計允許的,也是 C/S 架構教學的常見場景。
// 命令行指定入口類
java com.example.ServerMain // 啟動服務端
java com.example.ClientMain // 啟動客戶端(可同時開多個終端運行)
// IDE 運行配置
// Run Configuration -> Main class: 選擇具體類
| 規則 | 說明 |
|---|---|
| 包級別 | 無限制,同包可有多個 public class X { main() } |
| 類級別 | 每個類最多一個 public static void main(String[]) |
| 運行時 | JVM 只調用指定類的 main,其他類的 main 不執行 |
| 多實例 | 同一 Client 類可啟動多進程(多終端運行同一命令) |
com.example.cschat
├── Server.java // public static void main() → 啟動 ServerSocket
├── Client.java // public static void main() → 連接 Server,啟動 UI
├── Message.java // 通信協議類
└── User.java // 實體類
public class SimulatedCS {
public static void main(String[] args) {
// 主線程啟動服務端
new Thread(() -> {
Server.main(new String[]{}); // 直接調用 Server.main
}, "ServerThread").start();
// 稍後啟動客戶端
try { Thread.sleep(1000); } catch (InterruptedException e) {}
Client.main(new String[]{}); // 主線程跑 Client
}
}
注意:這僅為教學演示,生產環境服務端與客戶端必須分離部署(不同進程、不同機器)。
# start-server.sh
java -Xms512m -Xmx1g -cp app.jar com.example.ServerMain
# start-client.sh
java -Xms128m -Xmx256m -cp app.jar com.example.ClientMain
Java 允許同包多 main 方法,體現了模塊化設計:每個類可獨立作為程序入口。C/S 教學利用此特性,將服務端、客戶端邏輯分離在不同類中,便於理解網絡通信雙方角色。關鍵認知:main 是進程入口,而非應用入口;一個應用可由多進程協作構成,各進程有各自的 main。