Java 中的接口還可以這樣用,你知道嗎弃揽?

Java 程序員都知道要面向接口編程脯爪,那 Java 中的接口除了定義接口方法之外還能怎么用你知道嗎?今天阿粉就來帶大家看一下 Java 中的接口還可以有哪些用法矿微。

基本特性

我們先看一下接口的基本特性

  1. 接口的定義需要使用關(guān)鍵字 interface痕慢;
  2. 接口定義的所有方法默認都是 public abstract
  3. 當(dāng)一個具體的 class 去實現(xiàn)一個interface時涌矢,需要使用implements 關(guān)鍵字掖举;
  4. 接口之間是可以多繼承,而類是只能單繼承的蒿辙;

如下所示拇泛,我們定義一個接口

package com.example.demo.inter;

import java.io.Serializable;
import java.util.RandomAccess;

/**
 * <br>
 * <b>Function:</b><br>
 * <b>Author:</b>@author java 極客技術(shù)<br>
 * <b>Date:</b>2022-09-24 17:38<br>
 * <b>Desc:</b>無<br>
 */
public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 可以省略

}

默認方法

JDK 8 之前接口是不支持默認方法的,在 JDK 8 之后接口支持默認方法思灌,默認方法采用關(guān)鍵詞 default 聲明俺叭。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 省略
  
  // 默認方法
  default String sayHello3() {
    return "hello3";
  }

}

默認方法跟抽象方法不一樣,接口中定義的抽象方法泰偿,當(dāng)接口被其他類實現(xiàn)的時候都需要全部實現(xiàn)熄守,但是默認方法是不需要被實現(xiàn)就可以直接使用的,類似于直接調(diào)用父類的方法一樣,所以在很多時候裕照,我們已經(jīng)繼承了一個類攒发,還想有一個能用但是不想每個子類都實現(xiàn)的方法的時候,就可以考慮增加一個接口的默認方法來使用晋南,簡單來說就是實現(xiàn)類可以不覆寫 default 方法惠猿。

default方法存在的目的是,在我們已經(jīng)完善的項目中负间,如果我們直接給一個接口增加一個方法偶妖,在沒有默認方法的時候就需要給所有的實現(xiàn)類都實現(xiàn)對應(yīng)的方法,但是這個方法又不一定是每個實現(xiàn)類都需要的政溃,所以這個時候默認方法就很好的解決了這個問題趾访,我們只需要增加一個默認方法,然后在需要使用的實現(xiàn)類中進行實現(xiàn)或者使用就可以了董虱,其他的實現(xiàn)類不需要改動任何的代碼扼鞋。

標(biāo)記

接口還有一個很常見的功能那就是標(biāo)記功能,這么說可能你沒有印象愤诱,但是到提到序列化接口 java.io.Serializable; 你肯定知道云头,我們經(jīng)常在對應(yīng)的 POJO 中都會實現(xiàn)這個序列化接口,而這個序列化的接口如果看過源碼的小伙伴肯定知道里面是沒有內(nèi)容的淫半。

同樣的功能除了序列化的接口盘寡,類似的空接口還有很多,比如 java.util.RandomAccess 也是空接口撮慨,之前阿粉也寫過關(guān)于 RandomAccess 這個接口的用途,感興趣的可以再去看看脆粥。 RandomAccess 明明是個空接口砌溺,能有什么用呢?

通過源碼我們可以知道 RandomAccess 是用來標(biāo)識子類是否實現(xiàn)了該接口变隔,如果實現(xiàn)了則走實現(xiàn)了的邏輯规伐,沒有實現(xiàn)就走沒有實現(xiàn)的邏輯,所以我們在日常開發(fā)中也可以利用這個特性匣缘,當(dāng)我們有不同的子類需要根據(jù)情況進行不同的實現(xiàn)邏輯的時候就可以采用定義一個空接口來標(biāo)記一下猖闪,方便后面的處理。

靜態(tài)方法

跟默認方法一樣肌厨,JDK 8 還支持在接口中增加靜態(tài)方法培慌,雖然說在接口中定義靜態(tài)方法的做法不常見,但是當(dāng)需要使用的時候也是可以支持的柑爸,避免在創(chuàng)建一個單獨的工具類吵护,跟在類中定義的靜態(tài)方法一樣,我們可以直接通過接口名稱引用靜態(tài)方法,當(dāng)然靜態(tài)變量也是可以的馅而,使用方法一樣祥诽。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
  String sayHello2();// public abstract 可以省略
  default String sayHello3() {
    System.out.println(sayHello4());
    return "hello3";
  }
  public static String sayHello4() {
    return "hello4";
  }
}

私有方法

大家有沒有注意到,上面不管是默認方法還是靜態(tài)方法其實都是 public 公開的瓮恭,可以讓實現(xiàn)類或者其他類直接使用雄坪,那有沒有可能在接口中定義一個私有方法呢?在 JDK 9 之前是不可以的屯蹦,JDK 9 卻支持了维哈,如下所示

  private void privateMethod() {
    System.out.println("private私有方法被調(diào)用");
  }

  private static void privateStaticMethod() {
    System.out.println("private私有靜態(tài)方法被調(diào)用");
  }

從官方的文檔中我們可以找到下面的描述,在 JDK 9 中接口支持私有方法颇玷,主要用于不同的非抽象方法中共享代碼笨农。

我們可以看到在 JDK 9 這樣寫是可以的

但是在 JDK8 就不行了,是無法編譯通過的帖渠,會提示不允許使用 private 修飾符谒亦。

總結(jié)

今天阿粉給大家總結(jié)了一個接口的使用方法,后面在日常的開發(fā)中我們不單單只是在接口中定義抽象方法空郊,也可以根據(jù)需求增加默認方法或者私有方法份招,以及在需要用到標(biāo)記的時候也可以通過定義一個空接口來實現(xiàn),怎么樣是不是很棒狞甚,感覺動起來吧锁摔。最后覺得我們的文章有幫助,歡迎一鍵三連哼审。

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谐腰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涩盾,更是在濱河造成了極大的恐慌十气,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春霍,死亡現(xiàn)場離奇詭異砸西,居然都是意外死亡,警方通過查閱死者的電腦和手機址儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門芹枷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莲趣,你說我怎么就攤上這事鸳慈。” “怎么了妖爷?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵蝶涩,是天一觀的道長理朋。 經(jīng)常有香客問我,道長绿聘,這世上最難降的妖魔是什么嗽上? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮熄攘,結(jié)果婚禮上兽愤,老公的妹妹穿的比我還像新娘。我一直安慰自己挪圾,他們只是感情好浅萧,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哲思,像睡著了一般洼畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棚赔,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天帝簇,我揣著相機與錄音,去河邊找鬼靠益。 笑死丧肴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胧后。 我是一名探鬼主播芋浮,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壳快!你這毒婦竟也來了纸巷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眶痰,失蹤者是張志新(化名)和其女友劉穎何暇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凛驮,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年条辟,在試婚紗的時候發(fā)現(xiàn)自己被綠了黔夭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡羽嫡,死狀恐怖本姥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杭棵,我是刑警寧澤婚惫,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布氛赐,位于F島的核電站,受9級特大地震影響先舷,放射性物質(zhì)發(fā)生泄漏艰管。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一蒋川、第九天 我趴在偏房一處隱蔽的房頂上張望牲芋。 院中可真熱鬧,春花似錦捺球、人聲如沸缸浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裂逐。三九已至,卻和暖如春泣栈,著一層夾襖步出監(jiān)牢的瞬間卜高,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工秩霍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篙悯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓铃绒,卻偏偏與公主長得像鸽照,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颠悬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容