亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:75日期:2022-08-21 15:31:51

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

首先說(shuō)一下結(jié)論:沒(méi)有辦法能夠做到重寫一個(gè)final修飾的方法,但是有其他的方法可以接近在子類中重新實(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(); //此處是父類引用和子類對(duì)象 instance.doSomething(); }}

SubClass.java

public class SubClass extends SuperClass { //doSomething是final方法,無(wú)法被重寫}

super class do something

Process finished with exit code 0

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

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

SubClass.java

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

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

DoSomethingAspect.aj

public aspect DoSomethingAsepct { // 環(huán)繞通知 匹配SuperClass類的doSomething方法 void around() : execution(* SuperClass.doSomething()) { if (thisJoinPoint.getThis() instanceof SubClass) { //調(diào)用子類方法 ((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類的overrideDoSomething方法,而如果是SuperClass對(duì)象的話調(diào)用的又是SuperClass里的doSomething方法。根據(jù)實(shí)際的類型決定調(diào)用的方法,就比較接近動(dòng)態(tài)綁定的機(jī)制了。而僅從調(diào)用的代碼來(lái)看和子類重寫方法(雖然實(shí)際是final)的效果是一樣的。

總結(jié)

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 九九视频免费观看 | 美国一级毛片∞ | 成人综合婷婷国产精品久久免费 | 国产精品亚洲精品日韩已满 | 国产成人免费手机在线观看视频 | 亚洲图片国产日韩欧美 | 成人女人a毛片在线看 | 大毛片a大毛片 | 久久午夜国产片 | 亚洲欧洲日产国码二区在线 | 久久青草免费免费91线频观看 | 亚洲天堂色网站 | 国产欧美综合在线一区二区三区 | 日本人一级毛片免费视频 | 最新国产一区二区精品久久 | 亚洲一区二区在线视频 | 欧美一区二区视频在线观看 | 在线观看国产精品日本不卡网 | 成人在线手机视频 | 国产精品色内内在线播放 | 亚洲图片偷拍自拍 | 久草资源在线播放 | 久久成人18免费网站 | fc2在线播放 | 欧美日韩视频免费播放 | 精品热线九九精品视频 | 日本免费毛片在线高清看 | 加勒比在线视频 | 国产成人综合日韩精品无 | 欧美顶级毛片在线播放小说 | 日鲁夜鲁鲁狠狠综合视频 | 毛片国产| 国产激情一区二区三区 | 欧美高清视频手机在在线 | 久久久久琪琪去精品色村长 | 狠狠五月深爱婷婷网 | 午夜伦y4480影院中文字幕 | 欧美一级毛片美99毛片 | 国产精品99久久久久久www | 国产在线一区二区三区在线 | 亚洲天堂男 |