Re: [J2SE] 多型與轉型

看板java作者 (喬巴)時間18年前 (2008/02/16 21:57), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串3/7 (看更多)
: 這是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
你這樣問我沒辦法回答你overriding只是一種描述,不會有結果
02/16 22:20, 1F

02/16 22:21, , 2F
你必須要有行為才會有結果,所以你應該缺了行為的描述。
02/16 22:21, 2F
文章代碼(AID): #17jkl9Zj (java)
討論串 (同標題文章)
文章代碼(AID): #17jkl9Zj (java)