java8之默認方法

默認方法是啥

默認方法是由default修飾符修飾躬翁,并像類中聲明的其他方法一樣包含方法體枉长。是Java8中新添加的能力。

默認方法能干啥

可選方法

默認方法的主要應用場景在定義API上齐莲,可以避免臨時往接口里面加方法導致的尷尬放祟。

舉一個身邊的例子。比如Android升級的時候往接口里加了個方法串结,但是方法又不常用哑子,升級的時候我們就不得不實現(xiàn)一下這個方法然后加一個空實現(xiàn)或者拋出一個未支持異常。但是現(xiàn)在有了默認方法肌割,這種場景下Android就可以寫一個默認方法卧蜓,不用我們非得實現(xiàn)一個我們不會去使用的接口方法了。

總之把敞,對于那些不是一定要實現(xiàn)的接口方法弥奸,我們可以避免在實現(xiàn)的時候刻意留白的情況出現(xiàn)。

函數(shù)式接口

之前講過奋早,函數(shù)式接口是只包含一個抽象方法的接口盛霎。這句話在以前不需要過多考慮,但是現(xiàn)在有了默認方法就不一樣了耽装。因為默認方法不是抽象方法愤炸,所以我們多些幾個默認方法是不影響的。實際上現(xiàn)在的函數(shù)式接口Predicate掉奄、Function以及Comparator確實也引入了默認方法规个。

行為的多繼承

當年學Java的時候,學到繼承的位置需要特別注意的一點是Java不像C++一樣支持行為多繼承。現(xiàn)在不一樣了诞仓,有了默認方法大家可以在接口里寫實現(xiàn)了缤苫,這時實現(xiàn)多個接口我們自然就擁有它們各個接口的能力了。

利用這一點墅拭,我們可以把能夠解決獨立能力的通用代碼抽成接口榨馁,并把需要的能力用默認方法實現(xiàn)。當我們想要用的這些能力的時候?qū)崿F(xiàn)一下接口就可以了帜矾。這種方式與模版設計模式類似。

默認方法存在啥問題

方法名沖突

在默認方法之前如果實現(xiàn)兩個有重名的方法的接口屑柔,對于重名的接口方法實現(xiàn)成一個就好了屡萤。但是現(xiàn)在有了默認方法,如果兩個接口中有同名的默認方法掸宛,那么在同時實現(xiàn)這兩個接口的時候會選擇使用哪一個方法呢死陆?這種情況有極低可能會出現(xiàn),但還是要有規(guī)則來處理這種問題唧瘾。

解決問題的三條規(guī)則

  1. 類中的方法優(yōu)先級最高措译。類或父類中聲明的方法的優(yōu)先級高于任何聲明為默認方法的優(yōu)先級。
  2. 如果無法依據(jù)第一條進行判斷饰序,那么子接口的優(yōu)先級最高:函數(shù)簽名相同時领虹,優(yōu)先選擇擁有最具體實現(xiàn)的默認方法的接口,即如果B繼承了A求豫,那么B就比A更加具體塌衰。
  3. 最后蝠嘉,如果還是無法判斷最疆,繼承了多個接口的類必須通過顯示覆蓋和調(diào)用期望的方法蚤告,顯示的選擇使用哪一個默認方法的實現(xiàn)。

以上三條規(guī)則就能夠處理所有沖突的問題杜恰,下面舉個例子說明一下获诈。

示例一
public interface A {
    default void hello() {
        System.out.println("A");
    };
}

public interface B extends A{
    @Override
    default void hello() {
        System.out.println("B");
    };
}

public class D implements A {
    //未實現(xiàn)hello()
}

public class C extends D implements B, A {
    public static void main(String... args) {
        new C().hello();
    }
}

看上面代碼,首先根據(jù)規(guī)則1心褐,類中聲明的方法具有最高權(quán)限烙荷,但是類D中并未實現(xiàn)默認方法hello檬寂。這里如果類D實現(xiàn)了hello,那么他就擁有最高優(yōu)先級了。接下來看規(guī)則2昼伴,看誰更加具體匾旭,因為B繼承了A,那么B更加具體圃郊,所以打印出來的是"B"价涝。

示例二

先上代碼

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

public interface B {
    default void hello() {
        System.out.println("B");
    };
}
public class C implements B, A {
    public static void main(String... args) {
        new C().hello();
    }
}

這種情況會打印什么呢?答案是會拋出編譯錯誤色瘩,因為無法判斷出誰更具體一些逸寓。這個時候就需要顯式調(diào)用了居兆。

具體的方法是覆蓋實現(xiàn)該方法竹伸,并且在方法中顯式調(diào)用。關(guān)于顯示調(diào)用勋篓,Java8中引入的新語法X.super.m(...),其中X是你希望調(diào)用的m方法所在的父接口譬嚣。例如钢颂,上面的問題就可以像下面代碼這樣顯示調(diào)用拜银。

public class C implements B,A {

    public static void main(String... args) {
        new C().hello();
    }
    
    @Override
    public void hello() {
        A.super.hello();
    }
}

最后

多說兩句

雖然現(xiàn)在接口里也可以寫實現(xiàn)了,抽象類和接口還是有區(qū)別的盐股。首先類只能繼承一個抽象類,但可以實現(xiàn)多個接口疯汁。其次抽象類可以定義變量,接口不行幌蚊。

個人認為默認函數(shù)最大的意義還是便于API的編寫,避免接口必須實現(xiàn)的痛苦溢豆。

最最后

打完,收工搓茬!不要問我為什么跳過了Stream犹赖,因為功能很強大卷仑,寫起來太費勁了。歡迎大家討論提出意見~~

歡迎關(guān)注【Funny新青年】微信公眾號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锡凝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窜锯,更是在濱河造成了極大的恐慌,老刑警劉巖吞瞪,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工秩,死亡現(xiàn)場離奇詭異,居然都是意外死亡助币,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門眉菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俭缓,你說我怎么就攤上這事』梗” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵惜姐,是天一觀的道長椿息。 經(jīng)常有香客問我歹袁,道長寝优,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任孟抗,我火速辦了婚禮迁杨,結(jié)果婚禮上夸浅,老公的妹妹穿的比我還像新娘。我一直安慰自己帆喇,他們只是感情好警医,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布坯钦。 她就那樣靜靜地躺著,像睡著了一般婉刀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上突颊,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音爬橡,去河邊找鬼。 笑死糙申,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柜裸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼疙挺,長吁一口氣:“原來是場噩夢啊……” “哼怜浅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起海雪,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奥裸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾宙,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡冈绊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年埠啃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碴开。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖潦牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巴碗,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布召噩,位于F島的核電站,受9級特大地震影響具滴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痊银,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一施绎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谷醉,春花似錦、人聲如沸俱尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刃永,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斯够,已是汗流浹背喧锦。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工抓督, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燃少,地道東北人铃在。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像涌穆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宿稀,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359