一、編譯期決策vs執行期決策:Overload與Override的本質分界

print()是Overload,編譯器在編譯printer.print(data)這行字節碼時,只看變數 data 的宣告型別,並在編譯產出時就寫死了呼叫print(Object)的符號引用。它不會在執行期去動態檢查data到底是不是String。如果想動態判斷,必須在方法內部用多型或轉型處理。
二、 方法覆寫的防禦
當子類別想要覆寫父類別的方法時,JVM有著極其嚴格的語義規範:
三、 super調用鏈的架構陷阱
在覆寫父類別方法時,通常會使用super.method()調用父類別的邏輯,這裡藏著一個破壞封裝的陷阱。

在addAll()裡,myCount先加了3。呼叫super.addAll(),父類別底層用迴圈呼叫了this.add()。
父類別呼叫的this.add()被導向了子類別的add(),導致myCount又被重複累加了3 次。