在类中调用方法,即使它已在子类中重写(java)

时间:2011-04-04 15:47:41

标签: java inheritance

假设我有这个方法:

public void callDo(FeelFreeToExtend ext){
    ext.do()
}

FeelFreeToExtend在哪里:

public class FeelFreeToExtend {

    public void do(){
       System.out.println("DO");
    }

}

现在我知道有人可以覆盖do方法,但有没有办法可以在FeelFreeToExtend类中显式调用do方法?我认为这不是一个好主意,但它仍然很有趣。

3 个答案:

答案 0 :(得分:5)

不,不改变所有呼叫者的字节码/代码是不可能的。如果你想总是调用FeelFreeToExtend.do()使方法最终。

答案 1 :(得分:0)

将非访问限定符“final”附加到方法(使方法最终),这将停止覆盖该方法,因此将始终从任何子类调用此方法版本。

其次,如果你只是想从派生类访问一个超类方法,即使已经覆盖了超类方法,那么只需通过附加“super”来调用该方法。在方法调用之前。例如。要从子类中调用超类的方法“display”,请使用super.display()。 (这假设你是编码子类的人)

答案 2 :(得分:0)

实际上彼得所说的并不完全正确:实际上可以使用JNI(http://java.sun.com/docs/books/jni/html/fldmeth.html#26109)执行重写方法。在JNI中,有一种名为CallNonvirtual<Type>Method的方法正好允许这样做。

应用程序服务器或框架可以附带一个小型JNI实用程序以允许此类功能......

没有JNI,我认为这是不可能的。