public class Fullmoons {
static int DAY_IM = 1000*60*60*24;
// ❌ 編譯錯誤:非法啟動表達式
Calendar c = Calendar.getInstance();
c.set(2004, 1, 7, 15, 40); // 這裡報錯
public static void main(String[] args) { ... }
}
| 允許 | 不允許 |
|---|---|
| 字段聲明 + 初始化表達式 `Calendar c = Calendar.getInstance();` | 獨立執行語句 `c.set(...);` |
| 構造代碼塊 `{ c = Calendar.getInstance(); c.set(...); }` | 方法調用語句直接寫在類體 |
| 靜態代碼塊 `static { ... }` | 流程控制語句 |
public class Fullmoons {
private Calendar c;
public Fullmoons() {
c = Calendar.getInstance();
c.set(2004, 1, 7, 15, 40);
}
}
public class Fullmoons {
private Calendar c;
{ // 實例初始化塊
c = Calendar.getInstance();
c.set(2004, 1, 7, 15, 40);
}
}
public class Fullmoons {
private static Calendar c;
static { // 類加載時執行一次
c = Calendar.getInstance();
c.set(2004, 1, 7, 15, 40);
}
}
「Calendar 是抽象類不能 new,但 getInstance() 返回實例,為什麼還不行?」
與 Calendar 是否抽象無關。即使是 `String s = "a"; s.length();` 也不行。關鍵在於語句位置,而非對象創建方式。
Java 類體中只能寫聲明,不能寫執行語句。需初始化邏輯請放入構造器、實例初始化塊、靜態初始化塊三者之一。這是語言設計層面的強制規範,而非 Calendar 特有的限制。