Re: [J2SE] 多型與轉型
※ 引述《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
討論串 (同標題文章)
完整討論串 (本文為第 4 之 7 篇):