public static void main(String[] args)
public class Demo {
static {
System.out.println("1. 靜態區塊"); // 最先印出
}
public static void main(String[] args) {
System.out.println("3. main 方法");
}
{
System.out.println("2. 實例區塊"); // 不會執行,因未 new 物件
}
}
public class ArgsDemo {
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 8+ Stream 處理
Arrays.stream(args).forEach(System.out::println);
}
}
執行:`java ArgsDemo hello "world java" 123`
參數個數: 3
args[0] = hello
args[1] = world java
args[2] = 123
單一 JAR 可包含多個含 `main` 的類別,透過 `java -cp app.jar com.example.ClassA` 指定啟動類。`MANIFEST.MF` 的 `Main-Class` 決定 `java -jar` 行為。
複雜 CLI 請使用 Picocli、Apache Commons CLI 或 Spring Shell,支援子命令、型別轉換、自動生成幫助。
// module-info.java
module com.example.app {
requires java.logging;
// main 類別不需在 module-info 宣告
}
執行:`java --module-path mods -m com.example.app/com.example.Main`
// 反模式:main 巨大、難測試
public static void main(String[] args) { /* 500 行業務邏輯 */ }
// 正規模式:main 僅啟動器
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(App.class, args);
// 或手動組裝
MyService service = new MyServiceImpl(new DbRepo());
service.start(args);
}
java -Xms256m -Xmx1g -Denv=prod -jar app.jar --server.port=8080 --db.url=jdbc:mysql://...
↑ JVM 參數 ↑ 應用參數 (main args / Spring Boot properties)