Java中final修飾的方法是否可以被重寫示例詳解
這是一次阿里面試里被問到的題目,在我的印象中,final修飾的方法是不能被子類重寫的。如果在子類中重寫final修飾的方法,在編譯階段就會提示Error。但是回答的時候還是有點心虛的,因為final變量就可以用反射的方法進行修改,我也不太確定是否有類似的機制可以繞過編譯器的限制。于是面試之后特地上網搜了下這個問題,這里簡單記錄一下。
首先說一下結論:沒有辦法能夠做到重寫一個final修飾的方法,但是有其他的方法可以接近在子類中重新實現(xiàn)final方法并在運行時的動態(tài)綁定的效果。
這里需要用到一個aop框架叫aspectj,它和spring aop都是比較常用的aop框架。區(qū)別是spring aop是基于動態(tài)代理的,而aspectj有獨立的編譯器可以實現(xiàn)靜態(tài)代理。關于aspectj的安裝配置網上有很多文章了,這里就不再贅述,直接快進到例子。
首先定義一個SuperClass并在其中定義一個final方法。
SuperClass.java
public class SuperClass { public final void doSomething() { System.out.println("super class do something"); } public static void main(String[] args) { SuperClass instance = new SubClass(); //此處是父類引用和子類對象 instance.doSomething(); } }
SubClass.java
public class SubClass extends SuperClass { //doSomething是final方法,無法被重寫 }
super class do something
Process finished with exit code 0
運行main方法,SubClass繼承了doSomething方法,但是不能重寫,所以通常情況下調用的一定是SuperClass的doSomething方法。
在SubClass中實現(xiàn)“重寫”的doSomething方法
SubClass.java
public class SubClass extends SuperClass { //doSomething是final方法,無法被重寫 //子類只能在另一個函數中實現(xiàn)重寫的邏輯 protected void overrideDoSomething() { System.out.println("sub class do something"); } }
利用環(huán)繞通知修改實際調用的方法
DoSomethingAspect.aj
public aspect DoSomethingAsepct { // 環(huán)繞通知 匹配SuperClass類的doSomething方法 void around() : execution(* SuperClass.doSomething()) { if (thisJoinPoint.getThis() instanceof SubClass) { //調用子類方法 ((SubClass)thisJoinPoint.getThis()).overrideDoSomething(); } else { //調用原方法 proceed(); } } }
運行結果
sub class do something
Process finished with exit code 0
可以看到,調用SubClass的doSomething方法時實際調用的是SubClass類的overrideDoSomething方法,而如果是SuperClass對象的話調用的又是SuperClass里的doSomething方法。根據實際的類型決定調用的方法,就比較接近動態(tài)綁定的機制了。而僅從調用的代碼來看和子類重寫方法(雖然實際是final)的效果是一樣的。
總結
到此這篇關于Java中final修飾的方法是否可以被重寫的文章就介紹到這了,更多相關Java中final修飾的方法被重寫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot Maven項目中Model間的最佳繼承設計詳解
這篇文章主要為大家詳細介紹了SpringBoot中一個優(yōu)秀Maven項目的各Model間最佳繼承設計的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2024-01-01SpringBoot實現(xiàn)微信及QQ綁定登錄的示例代碼
本文主要介紹了SpringBoot實現(xiàn)微信及QQ綁定登錄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07使用多個servlet時Spring security需要指明路由匹配策略問題
這篇文章主要介紹了使用多個servlet時Spring security需要指明路由匹配策略問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08