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

Java8中的默認方法(面試者必看)

 更新時間:2020年11月26日 11:20:18   作者:Silently9527  
這篇文章主要介紹了Java8中的默認方法(面試者必看),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

在Java8之前,定義在接口中的所有方法都需要在接口實現(xiàn)類中提供一個實現(xiàn),如果接口的提供者需要升級接口,添加新的方法,那么所有的實現(xiàn)類都需要把這個新增的方法實現(xiàn)一遍,如果說所有的實現(xiàn)類能夠自己控制的話,那么還能接受,但是現(xiàn)實情況是實現(xiàn)類可能不受自己控制。比如說Java中的集合框架中的List接口添加一個方法,那么Apache Commons這種框架就會很難受,必須修改所有實現(xiàn)了List的實現(xiàn)類

現(xiàn)在的接口有哪些不便

向已經(jīng)發(fā)布的接口中添加新的方法是問題的根源,一旦接口發(fā)生變化,接口的實現(xiàn)者都需要更新代碼,實現(xiàn)新增的接口
接口中有些方法是可選的,不是所有的實現(xiàn)者都需要實現(xiàn),這個時候?qū)崿F(xiàn)類不得不實現(xiàn)一個空的方法,或者是提供一個Adapter對接口中所有的方法做空實現(xiàn),在Spring中我們可看到很多這種例子,比如WebMvcConfigurerAdapter

@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

 @Override
 public void configurePathMatch(PathMatchConfigurer configurer) {
 }


 @Override
 public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
 }

 @Override
 public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
 }
 
 省略其他代碼...
}

在Java8以后這些類都被標注成了過期@Deprecated

默認方法的簡介

為了解決上述問題,在Java8中允許指定接口做默認實現(xiàn),未指定的接口由實現(xiàn)類去實現(xiàn)。如何標識出接口是默認實現(xiàn)呢?方法前面加上default關(guān)鍵字。比如Spring中的WebMvcConfigurer

public interface WebMvcConfigurer {

 default void configurePathMatch(PathMatchConfigurer configurer) {
 }

 default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
 }

 default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
 }
 
 省略其他代碼...
}

從現(xiàn)在看來,可能大家都會有個疑問,默認方法和抽象類有什么區(qū)別呢?

  • 默認方法不能有實例變量,抽象類可以有
  • 一個類只能繼承一個抽象類,當時可以實現(xiàn)多個接口

默認方法的使用場景

可選方法

為接口提供可選的方法,給出默認實現(xiàn),這樣實現(xiàn)類就不用顯示的去提供一個空的方法;這種場景剛才我們在上面已經(jīng)說到了,spring中有大量的例子

實現(xiàn)多繼承

繼承是面向?qū)ο蟮奶匦灾?,在Java中一直以來都是單繼承的原則,Java8中默認方法為實現(xiàn)多繼承提供了可能(由于接口中不能有實例對象,所以能夠抽象的到接口中的行為一般都是比較小的模塊);從個人的經(jīng)歷來看,做游戲是訓練自己面向?qū)ο笏季S的最好方式(以后有機會分享一下小游戲的制作),因為現(xiàn)在大部分學Java的同學學完Java基礎(chǔ)后就直接進入JavaWeb的學習,整合各種框架,只能在通用的三層架構(gòu)(Controller、Service、Dao)中寫自己的邏輯。

相信很多人在都做個坦克大戰(zhàn)的游戲,如果用Java8中的默認方法如何設(shè)計好多繼承呢?

這里我們舉個簡單的例子,定義了三個接口:

  1. Moveable:允許移動的物體,把移動的邏輯放入到這個接口中的默認方法
  2. Attackable: 允許攻擊的物體,把攻擊的通用邏輯放入到默認方法,不通用的邏輯通過模板方法給實現(xiàn)類處理
  3. Location: 獲取物體的坐標

通過這些接口的組合方式,我們就可以為游戲創(chuàng)建不同的實現(xiàn)類,比如說坦克、草地、墻壁...

解決默認方法沖突規(guī)則(面試者必看)

通過上面的例子,我們體驗的默認方法給我們帶來了多繼承的便利,但是讓我們思考下,如果出現(xiàn)了不同的類出現(xiàn)的相同簽名的默認方法,實際在運行的時候應(yīng)該如何選擇呢?客官不慌,有辦法的

  • 類中的方法優(yōu)先級最高。如果類或者父類(抽象類也OK)中聲明了相同簽名的方法,那么優(yōu)先級最高
  • 如果第一條無法確定,那么最具體的的實現(xiàn)的默認方法;很繞,舉例子:B接口繼承了A,B就更加具體,那么B中的方法優(yōu)先級最高
  • 如果上面兩個都無法判斷,那么編譯會報錯,需要在實現(xiàn)接口,然后手動顯式調(diào)用
public class C implements A, B {
 void pint() {
  B.supper.print(); // 顯式調(diào)用
 }
}

菱形繼承問題

為了說明上面的三個原則,我們直接來看看最復(fù)雜的菱形繼承問題

public interface A {
 default void print(){
  System.out.println("Class A");
 }
}

public interface B extend A {}

public interface C extend A {}

public class D implement B, C {
 public static void main(String[] args) {
  new D().print()
 }
}

這種情況下B,C都沒有自己的實現(xiàn),實際上就只有A有實現(xiàn),那么會打印Class A

如果說這個時候把接口B接口改一下

public interface B extends A {
 default void print(){
  System.out.println("Class B");
 }
}

根據(jù)原則(2),B繼承于A,更加具體,所以打印結(jié)果應(yīng)該是B
如果說把接口C修改一下

public interface C extends A {
 default void print(){
  System.out.println("Class C");
 }
}

這時候我們發(fā)現(xiàn)編譯報錯,需要我們自己手動指定,修改D中的代碼

public class D implements B, C {

 @Override
 public void print() {
  C.super.print();
 }

 public static void main(String[] args) {
  new D().print();
 }
}

總結(jié)

  • Java8中的默認方法需要使用default來修飾
  • 默認方法的使用場景可選方法和多繼承
  • 三個原則解決相同簽名的默認方法沖突問題

到此這篇關(guān)于Java8中的默認方法(面試者必看)的文章就介紹到這了,更多相關(guān)Java8 默認方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Lombok的詳細使用及優(yōu)缺點總結(jié)

    Lombok的詳細使用及優(yōu)缺點總結(jié)

    最近在學Mybatis,接觸到了Lombok的使用,所以寫一篇文章記錄一下,包括lombok的安裝及使用優(yōu)缺點,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java?SpringBoot?中的操作事務(wù)

    Java?SpringBoot?中的操作事務(wù)

    這篇文章主要介紹了Java?SpringBoot?中的操作事務(wù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • java web過濾器處理亂碼

    java web過濾器處理亂碼

    本文主要介紹了java web過濾器處理亂碼的方法解析。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • 在idea中全局引入并運行ElementUI方式

    在idea中全局引入并運行ElementUI方式

    本文詳細描述了如何在IDEA中使用ElementUI,包括從官網(wǎng)獲取連接、在IDEA終端運行命令安裝ElementUI,以及如何在項目中全局引入ElementUI,通過新建頁面并配置index.js和ElementUI.vue,可以實現(xiàn)在本地服務(wù)器上的展示
    2024-10-10
  • Java如何獲取主機的基本信息詳解

    Java如何獲取主機的基本信息詳解

    最近遇到一個工作需求,上網(wǎng)查了一下怎樣在Java中獲取本機的ip和主機名,所以下面這篇文章主要給大家介紹了關(guān)于Java如何獲取主機的基本信息,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • SpringMvc實現(xiàn)簡易計算器功能

    SpringMvc實現(xiàn)簡易計算器功能

    這篇文章主要為大家詳細介紹了SpringMvc實現(xiàn)簡易計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 常用java正則表達式的工具類

    常用java正則表達式的工具類

    這篇文章主要為大家詳細介紹了常用java正則表達式的工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • java poi實現(xiàn)Excel多級表頭導(dǎo)出方式(多級表頭,復(fù)雜表頭)

    java poi實現(xiàn)Excel多級表頭導(dǎo)出方式(多級表頭,復(fù)雜表頭)

    文章介紹了使用javapoi庫實現(xiàn)Excel多級表頭導(dǎo)出的方法,通過主代碼、合并單元格、設(shè)置表頭單元格寬度、填充數(shù)據(jù)、web下載和提供表頭樣式、內(nèi)容樣式以及標題樣式等步驟,作者實現(xiàn)了最終的效果
    2025-01-01
  • JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實現(xiàn)

    JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實現(xiàn)

    這篇文章主要介紹了JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實現(xiàn),需要的朋友可以參考下
    2020-12-12
  • 如何使用java agent修改字節(jié)碼并在springboot啟動時自動生效

    如何使用java agent修改字節(jié)碼并在springboot啟動時自動生效

    本文介紹了JavaAgent的使用方法和在SpringBoot中的應(yīng)用,JavaAgent可以通過修改類的字節(jié)碼,實現(xiàn)對非Spring容器管理對象的AOP處理,演示了如何定義切面邏輯,實現(xiàn)接口mock,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

广州市| 汝城县| 尤溪县| 胶南市| 阜平县| 璧山县| 天气| 阳信县| 千阳县| 托克托县| 开封县| 安康市| 保康县| 平湖市| 保定市| 江口县| 开封县| 都兰县| 治县。| 绍兴县| 宜春市| 富锦市| 胶南市| 马边| 广州市| 云阳县| 隆回县| 烟台市| 黄浦区| 黔西| 中江县| 五莲县| 分宜县| 行唐县| 镇雄县| 黎平县| 丽水市| 乡宁县| 高台县| 宝兴县| 桐柏县|