2011-04-04 48 views
1

假設我有這樣的方法:調用方法在課堂上,即使它已經在子類(JAVA)被覆蓋

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

哪裏FeelFreeToExtend是這樣的:

public class FeelFreeToExtend { 

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

} 

現在我知道有人可以重寫do方法,但有沒有辦法可以明確調用FeelFreeToExtend類中的do方法?我認爲這不會是一個好主意,但它仍然很有趣。

回答

5

不,不可能不更改所有呼叫者的字節碼/代碼。如果你想總是調用FeelFreeToExtend.do()使方法最終。

+1

很酷,這是我的想法,但我只是想確保。 – sixtyfootersdude 2011-04-04 16:11:32

0

在方法中添加非訪問限定符「final」(使方法成爲final),這將停止方法被覆蓋,因此該方法的這個版本將始終從任何子類調用。其次,如果你只是想從派生類訪問一個超類方法,即使超類方法已被覆蓋,那麼只需通過追加「super」來調用該方法即可。在方法調用之前。例如,要從子類中調用「顯示」超類的方法,請使用super.display()。 (這假設你是編碼子類的人)

0

其實Peter說的並不完全正確:實際上可以使用JNI執行重寫的方法(http://java.sun.com/docs/books/jni/html/fldmeth.html#26109)。在JNI中有一種叫做CallNonvirtual<Type>Method的方法。

應用服務器或框架可以用小JNI工具運到允許這種功能...

沒有JNI我不認爲這是可能的。