欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

首先說一下結(jié)論:沒有辦法能夠做到重寫一個(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方法,無法被重寫

}

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方法,無法被重寫
 //子類只能在另一個(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)用的代碼來看和子類重寫方法(雖然實(shí)際是final)的效果是一樣的。

總結(jié)

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

相關(guān)文章

  • SpringBoot Maven項(xiàng)目中Model間的最佳繼承設(shè)計(jì)詳解

    SpringBoot Maven項(xiàng)目中Model間的最佳繼承設(shè)計(jì)詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中一個(gè)優(yōu)秀Maven項(xiàng)目的各Model間最佳繼承設(shè)計(jì)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01
  • 教你怎么用Java操作Redis

    教你怎么用Java操作Redis

    今天帶大家來學(xué)習(xí)怎么用Java操作Redis,文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,建議有redis基礎(chǔ)并熟悉redis的基本數(shù)據(jù)類型命令的小伙伴學(xué)習(xí),需要的朋友可以參考下
    2021-05-05
  • SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼

    SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)微信及QQ綁定登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 輕松掌握J(rèn)ava代理模式

    輕松掌握J(rèn)ava代理模式

    這篇文章主要幫助大家輕松掌握J(rèn)ava代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 如何解決springboot讀取配置文件的中文亂碼問題

    如何解決springboot讀取配置文件的中文亂碼問題

    本篇文章主要介紹了如何解決springboot讀取配置文件的中文亂碼問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看
    2018-05-05
  • Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過程詳解

    Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過程詳解

    這篇文章主要介紹了Jenkin郵件收發(fā)實(shí)現(xiàn)原理及過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Springboot深入講解nocos的整合與使用

    Springboot深入講解nocos的整合與使用

    Nacos?是阿里巴巴推出來的一個(gè)新開源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),在項(xiàng)目開發(fā)過程中,我們經(jīng)常使用nacos作為配置中心和注冊(cè)中心。本文章我們就從代碼層面研究下springboot是如何整合nacos使用的
    2022-07-07
  • 使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題

    這篇文章主要介紹了使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java基礎(chǔ)類之ArrayUtils工具類詳解

    Java基礎(chǔ)類之ArrayUtils工具類詳解

    這篇文章主要介紹了java.ArrayDeque類使用方法,java.ArrayDeque類提供了可調(diào)整大小的陣列,并實(shí)現(xiàn)了Deque接口,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論