荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: tang (-----), 信区: Java
标  题: Re: 就是这篇啊
发信站: 荔园晨风BBS站 (Wed Nov 14 13:56:04 2001), 转信

Java里的方法都是virtual的,也就是所有的调用都是间接的(更准确点叫运行时绑定,
到运行时才决定调用的实际是哪个方法),这类语言的典型实现方法是所有类都有一
张虚表维护每个方法的入口地址,继承时保留基类的虚表并对其进行扩展以登记派生
类新的方法,如果派生类重载基类的方法只是简单地修改从基类继承下来的虚表里相
关的入口项。这样,因为对基类某个方法的调用无论是在基类里还是在派生类里都是
使用同一个虚表的同一个方法的入口地址,所以调的都是同一个方法(派生类的重载
方法,如果有重载的话)。

其实写程序不需要管这些细节,明白java的语言模式就可以了,知道virtual method
的行为如此这般就行了,不用管为什么的,深入点可以知道一下这样做的作用,如virtual
的作用是让同一个名字在不同的上下文(context)里代表不同的意义,增加语言的表现
力,同时可以通过派生的办法(其实是引入新的上下文)更改基类的行为,保持统一的
接口。

呵呵,是理论,现在深大计算机有没有开程序设计理论课,分析比较各种程序设计语
言及其各种可能的实现方法?
【 在 junire (好好学习,天天向上) 的大作中提到: 】
: 那么我想问一下的是,为什么第二次没有调用base了,而是直接调用了
: expesion里的add()方法?
: 【 在 Lg (创造人生的传奇) 的大作中提到: 】
: : 我不是高手,对这个类的继承理解也不是很透彻,这里只是说说我的想法。
: : 当获取子类Extension的实例时,它会调用相关的构造函数。并且如果这个构造
: : 函数没有显式调用父类的构造函数,那么它会缺省调用super(),所以它先调了
: : Base(),因为子类Extension已经覆盖了add()的实现,所以Base()里面的add()
: : 实际上也是执行子类的实现。这样i=2, 然后调用了Extension()里面的add(2),
: : i = 6;最后就是22。


--
※ 修改:·tang 於 Nov 14 15:46:14 修改本文·[FROM: 203.93.19.1]
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 203.93.19.1]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店