Re: [J2SE] 多型與轉型
: 這是overridding(覆蓋)的問題
: 子類別繼承父類別的時候如果複寫掉父親的方法,
: 則由子類別產生的物件實體就只會具有子類別所時做的方法.
: (如果需要使用父類別的方法,只能在子類別內透過super關鍵字呼叫。)
: 如果你單純記實體不實體的話,可能會翻船。
: 比方說下列的狀況
: void foo(){
: Father father = ((Father) this);
: Son son = ((Son) this);
: System.out.println(father.greeting());
這一行會印出 class Son, 是因為 father 這個名稱是在 Son 類別中,帶有 Son 類別
的屬性及方法,當呼叫 father.greeting() 時,就會先去找 Son 類別中有沒有
greeting() 方法,若有,就執行之。
雖然 father 帶有 Father 類別的屬性及方法,但被 Son 類別給 override,
所以才會變成 class Son。
: System.out.println(son.greeting());
Son 類別中有 greeting() 方法,執行 son.greeting() 時,是 class Son。
: System.out.println(father.name);
會是 father, 因為是執行父類別的屬性,
: System.out.println(son.name);
會是 son,執行子類別的屬性
: }
: 請問後面兩個name印出來的會是什麼? :)
: 這個就自己試試看吧
: 這跟method的差異是method是直接被覆蓋,
: member的話,只是被子member給「遮掩」而已。
: (有點類似local variable跟member variable需要透過this區隔的差異)
: 所以當我在son內如果有需要取得father的greeting()的時候
: 要盡量透過super.greeting() 來處理,而避免透過轉型。
: 同樣的要存取父類別name也是透過super.name來處理
: System.out.println(super.name);
當子類別跟父類別均有同樣的屬性及方法時,
overriding 屬性跟 overriding 方法結果會不一樣?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.116.199.209
推
02/16 22:20, , 1F
02/16 22:20, 1F
→
02/16 22:21, , 2F
02/16 22:21, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 7 篇):