Re: [J2SE] 多型與轉型

看板java作者時間18年前 (2008/02/17 14:05), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/7 (看更多)
※ 引述《forris (喬巴)》之銘言: : class Father{ : String name = "Father"; : String getName(){ : return name; : } : String greeting(){ : return "class Father"; : } : } : class Son extends Father{ : String name = "Son"; : String greeting(){ : return "class Son"; : } : void foo(){ : System.out.println(((Son)this).greeting()); : System.out.prtinln(((Father)this).greeting()); : } : } ///恕刪 我想你的問題,應該從binding的角度來解釋比較好 所謂的binding,比較不正式的說,是指程式中變數、參照與記憶體中實際位址 與內容的結合。 而binding又可以分成late binding與early binding。 如果你熟悉C/C++的話,我想你會比較有感覺。 不過我想直接跳過太囉嗦的Language Model的部份來解釋兩者的不同應該比較合適 所謂的early binding,指的是變數的內容或者要呼叫的函式所在位址(記憶體位址) 在編譯時候就被指定了。 然而late binding,則剛好相反,是在程式執行的時候才決定。 在Java language中,都是late binding。所以當你呼叫this.greeting()時 是在程式執行時候決定(JVM會幫你處理),因此不管你怎麼轉型,呼叫到的都是 Son的greeting()。除非你明確使用super關鍵子告訴JVM你要呼叫父類別的greeting() 也就是說,JVM是在執行的時候,根據你的參照(reference)所指到的實體來決定 greeting()要從哪一個記憶體位址開始執行。 為了更好的理解,我們稍微探討一下C/C++的例子。 以C/C++的角度來看這樣子的例子的話(非Reference & Pointer) C/C++預設是early binding。除非在函式宣告的時候使用virtual關鍵字 否則會套用預設的early binding。因此上述的例子,則會印Father和Son。 我想我解釋的不是很好....因為實在懶得打字.... 如果有興趣的話,問一下google,late binding和early binding,會有滿意的 記憶體跟語言模型可以看... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.67.160
文章代碼(AID): #17jywP24 (java)
文章代碼(AID): #17jywP24 (java)