iT邦幫忙

2026 iThome 鐵人賽

DAY 0
0
Build on Google AI

把Google AI當夥伴打造個人高效Coding工作流系列 第 5 篇

第五天 繼承與方法改寫的陷阱,super調用鏈與Object核心方法

  • 分享至 

  • xImage
  •  

一、編譯期決策vs執行期決策:Overload與Override的本質分界
https://ithelp.ithome.com.tw/upload/images/20261001/20184350S9WF8xkO3z.png
https://ithelp.ithome.com.tw/upload/images/20261001/201843505z7EtT4l4L.png
print()是Overload,編譯器在編譯printer.print(data)這行字節碼時,只看變數 data 的宣告型別,並在編譯產出時就寫死了呼叫print(Object)的符號引用。它不會在執行期去動態檢查data到底是不是String。如果想動態判斷,必須在方法內部用多型或轉型處理。


二、 方法覆寫的防禦
當子類別想要覆寫父類別的方法時,JVM有著極其嚴格的語義規範:

  • 兩同:方法名稱相同、參數清單完全相同
  • 兩小:
    * 回傳型態變小(協變返回型態,Covariant Return Type):子類別回傳的型別必須與父類別相同,或者是父類別回傳型別的子類別(例如父類回傳 Number,子類可以改寫回傳 Integer)。
    * 拋出異常變小:子類別宣告拋出的受檢例外(Checked Exception)不能比父類別更廣泛。
  • 一大:
    * 存取權限變大:子類別不能限縮父類別的方法能見度(例如父類為 protected,子類只能是 protected 或 public,絕對不能是 private)。

三、 super調用鏈的架構陷阱
在覆寫父類別方法時,通常會使用super.method()調用父類別的邏輯,這裡藏著一個破壞封裝的陷阱。
https://ithelp.ithome.com.tw/upload/images/20261001/201843506iWQj7jSdD.png
https://ithelp.ithome.com.tw/upload/images/20261001/201843508mdm8xJulU.png
在addAll()裡,myCount先加了3。呼叫super.addAll(),父類別底層用迴圈呼叫了this.add()。
父類別呼叫的this.add()被導向了子類別的add(),導致myCount又被重複累加了3 次。

  • 繼承打破了父類別的封裝細節,子類別必須完全清楚父類別內部每個方法之間的交互調用,不然系統在重構時容易會崩潰。

上一篇
第四天 物件初始化完整順序與 this 核心
下一篇
第六天 多型與動態綁定機制—轉型陷阱、Pattern Matching與架構解耦
系列文
把Google AI當夥伴打造個人高效Coding工作流 共 6 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言