读书人

static 步骤的继承和 super

发布时间: 2012-10-31 14:37:32 作者: rapoo

static 方法的继承和 super
如果一个static方法被子类覆盖(override)了,运行时会调用哪个版本呢?
第二个问题,我们有时候会用super去调用父类的实现。如果这个类又被继承了,那这个super会指向哪个类呢?

下面的程序的运行结果是什么呢?

class High {void doIt () {System.out.println("doIt in High");}}class Mid extends High {void doIt () {System.out.println("doIt in Mid");}void makeIt () {super.doIt();}static void mmm () {System.out.println("static in Mid");}}class Low extends Mid {void doIt () {System.out.println("doIt in Low");}static void mmm () {System.out.println("static in Low");}}public class Test {public static void main (String[] args) {Low obj1 = new Low();Mid obj2 = new Low();obj1.makeIt();obj2.makeIt();obj1.mmm();obj2.mmm();}}


结果是这样的:

doIt in High
doIt in High
static in Low
static in Mid



1 楼 myali88 2009-05-21 我想静态方法是编译期绑定的,实例方法才是动态绑定,这样的结果很正常。 2 楼 chongkai 2009-05-22 发表的时候太匆忙了,我也来解释一下吧。

关于super,Low 的 makeIt 是从 Mid 继承来的,但 Mid 对于 makeIt 的实现是调用 super 的 doIt。测试代码中的 obj1 和 obj2 的运行时类型都是 Low,那么在执行 makeIt 的时候,都是调用 Low 的版本。虽然 Low 的 super 应该是 Mid,但是确定这个 super 不是基于“在哪个类的对象上调用方法”,而是基于“这个方法是在哪个类中定义的”,因为这个方法是在 Mid 中定义的,所以super 应该指向 Mid 的super,即 High。只有这样才能保证一致性:不管是哪一级的子类调用这个继承来的方法,最终被调用的都是 High 的 doIt 版本。

关于 static 方法,这个问题是在一次面试时遇到的,很不幸,当时答错了。^_^

读书人网 >软件架构设计

热点推荐