我可以从超级超级中调用一个被覆盖的方法吗?

时间:2011-11-26 19:40:44

标签: java inheritance polymorphism dynamic-binding

假设我有这三个类:

class Foo {
    void fn() {
        System.out.println("fn in Foo");
    }
}

class Mid extends Foo {
    void fn() {
        System.out.println("fn in Mid");
    }
}

class Bar extends Mid {
    void fn() {
        System.out.println("fn in Bar");
    }

    void gn() {
        Foo f = (Foo) this;
        f.fn();
    }
}

public class Trial {
    public static void main(String[] args) throws Exception {
        Bar b = new Bar();
        b.gn();
    }
}

是否可以拨打Foo fn()?我知道gn()中的解决方案不起作用,因为this指向Bar类型的对象。

1 个答案:

答案 0 :(得分:5)

在Java中是不可能的。您可以使用super,但它始终使用类型层次结构中的立即超类中的方法。

另请注意:

Foo f = (Foo) this;
f.fn();

polymoprhism 的定义虚拟调用的工作方式:即使f的类型为Foo,但在运行时f.fn()也会调度到{{} 1}}。编译时类型并不重要。