作者scarsnight ()
看板java
标题Re: [J2SE] 多型与转型
时间Sun Feb 17 14:05:12 2008
※ 引述《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