{ ... }public class Demo {
{ // 實例初始化區塊
System.out.println("建立實例時執行");
}
static { // 靜態初始化區塊
System.out.println("類別載入時執行");
}
}
new 一次執行一次,先於建構子。void method() {
{ int x = 1; } // x 只在這裡可見
{ int x = 2; } // 合法:不同區塊可重複變數名
}
⚠️ 無其他語意:不建立新堆疊幀、不影響效能、僅限制變數可見範圍。
label: 合法語法標籤必須緊接一個語句,該語句若為宣告/運算式需用 {} 包成複合語句。
label1: int i = 0; // 編譯錯誤:單行宣告非語句
label2: int j; // 錯誤:未初始化
label3: if (flag) break label3; // 錯誤:break 目標需為區塊
// 1. 標籤 + 區塊(最常用)
outer: {
int x = 1;
if (cond) break outer; // 跳出區塊
System.out.println("不會執行");
}
// 2. 標籤 + 迴圈(break/continue 指定層級)
outerLoop: for (int i = 0; i < 10; i++) {
innerLoop: for (int j = 0; j < 10; j++) {
if (i * j > 20) break outerLoop; // 直接跳出雙層
}
}
if () {} 中的 {} 與 if () 是獨立語法if (cond) // if 語句
statement; // 單一語句(可為區塊、宣告、運算式等)
if (cond) { // if 語句
// 區塊語句(複合語句)
}
結論:if、for、while 後面接的是「語句」;{} 是「區塊語句」的一種。兩者正交,非綁定關係。
break/continue 僅用於多層迴圈跳出,避免濫用導致義大利麵代碼。if/for 務必加大括號,防止維護時漏行 Bug。理解「語句」與「區塊」的語法分層,能寫出編譯器接受、同事易讀、除錯不踩雷的代碼。標籤語句是結構化 goto 的受限形式,善用於多層迴圈一次跳出,其餘場合請用方法抽取、布林旗標、異常等更清晰的控制流手段。