錯誤現象
父類定義非靜態方法,子類嘗試用 static 修飾符「重寫」該方法,編譯器報錯:「父類的非靜態方法不能被子類覆蓋為靜態方法」。
規則解析
Java 方法覆寫遵循嚴格規則,關鍵點包括:
- 簽名一致:方法名、參數列表、返回類型必須相同。
- 權限不減:子類方法訪問權限 ≥ 父類。
- 異常不增:子類拋出的受檢異常範圍 ⊆ 父類。
- 靜態與非靜態不可互相覆寫:
- 父類 static 方法 → 子類不能改為非 static(隱藏而非覆寫)。
- 父類非 static 方法 → 子類不能改為 static(編譯錯誤)。
- 私有方法不可覆寫。
- 抽象方法可被實現或繼續聲明為抽象。
- 非抽象方法可被覆寫為抽象(將類變為抽象類)。
本質區別
- 實例方法:綁定到對象,運行時多態分派(動態綁定)。
- 靜態方法:綁定到類,編譯時靜態綁定,不存在多態,子類同名靜態方法僅是隱藏父類方法。
修正建議
若需多態行為,保持方法非靜態;若確需類級別方法,父子類均聲明為 static 並接受隱藏語義(通過類名調用)。