最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中final修飾的方法是否可以被重寫(xiě)示例詳解

 更新時(shí)間:2020年11月04日 10:20:33   作者:卷卷子  
這篇文章主要給大家介紹了關(guān)于Java中final修飾的方法是否可以被重寫(xiě)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

這是一次阿里面試?yán)锉粏?wèn)到的題目,在我的印象中,final修飾的方法是不能被子類(lèi)重寫(xiě)的。如果在子類(lèi)中重寫(xiě)final修飾的方法,在編譯階段就會(huì)提示Error。但是回答的時(shí)候還是有點(diǎn)心虛的,因?yàn)閒inal變量就可以用反射的方法進(jìn)行修改,我也不太確定是否有類(lèi)似的機(jī)制可以繞過(guò)編譯器的限制。于是面試之后特地上網(wǎng)搜了下這個(gè)問(wèn)題,這里簡(jiǎn)單記錄一下。

首先說(shuō)一下結(jié)論:沒(méi)有辦法能夠做到重寫(xiě)一個(gè)final修飾的方法,但是有其他的方法可以接近在子類(lèi)中重新實(shí)現(xiàn)final方法并在運(yùn)行時(shí)的動(dòng)態(tài)綁定的效果。

這里需要用到一個(gè)aop框架叫aspectj,它和spring aop都是比較常用的aop框架。區(qū)別是spring aop是基于動(dòng)態(tài)代理的,而aspectj有獨(dú)立的編譯器可以實(shí)現(xiàn)靜態(tài)代理。關(guān)于aspectj的安裝配置網(wǎng)上有很多文章了,這里就不再贅述,直接快進(jìn)到例子。

首先定義一個(gè)SuperClass并在其中定義一個(gè)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(); //此處是父類(lèi)引用和子類(lèi)對(duì)象
  instance.doSomething();
 }

}

SubClass.java

public class SubClass extends SuperClass {

 //doSomething是final方法,無(wú)法被重寫(xiě)

}

super class do something

Process finished with exit code 0

運(yùn)行main方法,SubClass繼承了doSomething方法,但是不能重寫(xiě),所以通常情況下調(diào)用的一定是SuperClass的doSomething方法。

在SubClass中實(shí)現(xiàn)“重寫(xiě)”的doSomething方法

SubClass.java

public class SubClass extends SuperClass {

 //doSomething是final方法,無(wú)法被重寫(xiě)
 //子類(lèi)只能在另一個(gè)函數(shù)中實(shí)現(xiàn)重寫(xiě)的邏輯
 protected void overrideDoSomething() {
  System.out.println("sub class do something");
 }

}

利用環(huán)繞通知修改實(shí)際調(diào)用的方法

DoSomethingAspect.aj

public aspect DoSomethingAsepct {
 // 環(huán)繞通知    匹配SuperClass類(lèi)的doSomething方法
 void around() : execution(* SuperClass.doSomething()) {
  if (thisJoinPoint.getThis() instanceof SubClass) {
   //調(diào)用子類(lèi)方法
   ((SubClass)thisJoinPoint.getThis()).overrideDoSomething();
  } else {
   //調(diào)用原方法
   proceed();
  }
 }

}

運(yùn)行結(jié)果

sub class do something

Process finished with exit code 0

可以看到,調(diào)用SubClass的doSomething方法時(shí)實(shí)際調(diào)用的是SubClass類(lèi)的overrideDoSomething方法,而如果是SuperClass對(duì)象的話調(diào)用的又是SuperClass里的doSomething方法。根據(jù)實(shí)際的類(lèi)型決定調(diào)用的方法,就比較接近動(dòng)態(tài)綁定的機(jī)制了。而僅從調(diào)用的代碼來(lái)看和子類(lèi)重寫(xiě)方法(雖然實(shí)際是final)的效果是一樣的。

總結(jié)

到此這篇關(guān)于Java中final修飾的方法是否可以被重寫(xiě)的文章就介紹到這了,更多相關(guān)Java中final修飾的方法被重寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題

    解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題

    這篇文章主要介紹了解決mybatis plus 分頁(yè)查詢(xún)有條數(shù),total和pages都是零的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • mybatis的mapper特殊字符轉(zhuǎn)移及動(dòng)態(tài)SQL條件查詢(xún)小結(jié)

    mybatis的mapper特殊字符轉(zhuǎn)移及動(dòng)態(tài)SQL條件查詢(xún)小結(jié)

    mybatis mapper文件中條件查詢(xún)符,如>=,<,之類(lèi)是不能直接寫(xiě)的會(huì)報(bào)錯(cuò)的需要轉(zhuǎn)移一下,本文給大家介紹了常見(jiàn)的條件查詢(xún)操作,對(duì)mybatis的mapper特殊字符及動(dòng)態(tài)SQL條件查詢(xún)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • Java查詢(xún)Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢(xún))、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序

    Java查詢(xún)Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢(xún))、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序

    在Java開(kāi)發(fā)中Elasticsearch(簡(jiǎn)稱(chēng)ES)是一個(gè)非常流行的搜索引擎,它提供了強(qiáng)大的全文搜索和分析功能,這篇文章主要給大家介紹了關(guān)于Java查詢(xún)Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢(xún))、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 詳解Guava Cache本地緩存在Spring Boot應(yīng)用中的實(shí)踐

    詳解Guava Cache本地緩存在Spring Boot應(yīng)用中的實(shí)踐

    Guava Cache是一個(gè)全內(nèi)存的本地緩存實(shí)現(xiàn),本文將講述如何將 Guava Cache緩存應(yīng)用到 Spring Boot應(yīng)用中。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題

    java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題

    這篇文章主要介紹了java的MybatisPlus調(diào)用儲(chǔ)存過(guò)程的返回?cái)?shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java從源碼看異步任務(wù)計(jì)算FutureTask

    Java從源碼看異步任務(wù)計(jì)算FutureTask

    這篇文章主要介紹了Java從源碼看異步任務(wù)計(jì)算FutureTask,F(xiàn)utureTask就能夠很好的幫助我們實(shí)現(xiàn)異步計(jì)算,并且可以實(shí)現(xiàn)同步獲取異步任務(wù)的計(jì)算結(jié)果,具體是怎樣實(shí)現(xiàn)的,下面我們就一起來(lái)學(xué)習(xí)下面文章的具體內(nèi)容吧
    2022-04-04
  • Java中\(zhòng)n和\r區(qū)別

    Java中\(zhòng)n和\r區(qū)別

    本文主要介紹了Java中\(zhòng)n和\r區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 記一次線上SpringCloud Feign請(qǐng)求服務(wù)超時(shí)異常排查問(wèn)題

    記一次線上SpringCloud Feign請(qǐng)求服務(wù)超時(shí)異常排查問(wèn)題

    這篇文章主要介紹了記一次線上SpringCloud Feign請(qǐng)求服務(wù)超時(shí)異常排查問(wèn)題,本項(xiàng)目與下游項(xiàng)目均注冊(cè)在Eureka上面,對(duì)這個(gè)1秒就超時(shí)感到很迷惑,于是開(kāi)始查閱底層源碼之旅。需要的朋友可以參考下
    2022-01-01
  • Lombok在idea中的使用教程

    Lombok在idea中的使用教程

    Lombok是一個(gè)可以通過(guò)簡(jiǎn)單的注解形式,來(lái)幫助我們簡(jiǎn)化消除一些必須有但顯得很臃腫(如果getter、setter方法)的Java代碼的工具,通過(guò)使用對(duì)應(yīng)的注解,可以在編譯源碼的時(shí)候生成對(duì)應(yīng)的方法,這篇文章主要介紹了Lombok在idea中的使用,需要的朋友可以參考下
    2023-03-03
  • Java詳解ScriptEngine接口動(dòng)態(tài)執(zhí)行JS腳本

    Java詳解ScriptEngine接口動(dòng)態(tài)執(zhí)行JS腳本

    ScriptEngine是基本接口,其方法必須在本規(guī)范的每個(gè)實(shí)現(xiàn)中完全起作用。這些方法提供基本腳本功能。 寫(xiě)入這個(gè)簡(jiǎn)單接口的應(yīng)用程序可以在每個(gè)實(shí)現(xiàn)中進(jìn)行最少的修改。 它包括執(zhí)行腳本的方法,以及設(shè)置和獲取值的方法
    2022-08-08

最新評(píng)論

雷山县| 山东省| 离岛区| 疏勒县| 平定县| 威远县| 河曲县| 长子县| 枣庄市| 城市| 蒲城县| 乐东| 梁河县| 昭通市| 龙游县| 红桥区| 肃北| 泸州市| 武冈市| 温州市| 商都县| 平原县| 大安市| 凯里市| 昌宁县| 怀柔区| 德化县| 普定县| 芦山县| 基隆市| 巴林左旗| 利津县| 岱山县| 杨浦区| 汉沽区| 巧家县| 贡山| 太仆寺旗| 仁化县| 红桥区| 应城市|