【Java】談談Java中的接口


本文將介紹在 Java 語言中的接口。

通俗點來說邦鲫,接口就是方法的集合窜骄。

接口的定義格式

定義接口的格式:

public interface 接口名稱 {
    // 接口內容
}

接口內容可以包含:

JDK 1.7 中:

  • 常量
  • 抽象方法

JDK 1.8 中:

  • 常量
  • 抽象方法
  • 默認方法
  • 靜態(tài)方法

注意事項

  • 接口中是沒有靜態(tài)代碼塊或者構造方法的
  • 一個類的直接父類是唯一的屁药,但是一個類可以實現多個接口

接口中抽象方法的定義格式

接口的抽象方法定義格式如下:

public abstract void 方法名稱();

如果使用的是 IDEA 進行開發(fā)征峦,那么會看到方法 method 的修飾符 public abstract是灰色的,這是因為:在接口中呆贿,抽象方法的修飾符默認是 public abstract厉萝,所以我們可以省略這兩個修飾符:

void 方法名稱();

也可以省略一個:

public void 方法名稱1();
abstract void 方法名稱2();

抽象方法的使用

接口不能直接使用,必須有一個類來實現這個接口榨崩,這個類必須實現(覆蓋重寫)接口中的所有抽象方法谴垫。

定義一個接口 MyInterfaceAbstract

public interface MyInterfaceAbstract {
    public abstract void method();
}

定義一個實現類 MyInterfaceAbstractImpl

public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {
    @Override
    public void method() {
        System.out.println("這是抽象方法");
    }
}

創(chuàng)建實現類的對象進行使用:

public class Main {
    public static void main(String[] args) {
        MyInterfaceAbstractImpl myInterfaceAbstract = new MyInterfaceAbstractImpl();
        myInterfaceAbstract.method();
    }
}

輸出結果為:

這是抽象方法

注意事項

  • 不能直接 new 接口的對象,而是 new 實現類的對象

  • 如果實現類里沒有實現接口中的所有抽象方法母蛛,那么這個實現類自己就必須是抽象類翩剪。

接口中默認方法的定義格式

從 JDK 8 開始,接口里允許定義默認方法彩郊,可以有方法體前弯。

接口的默認方法定義格式如下:

public default 返回值類型 方法名稱(參數列表) {
    方法體...
}

默認方法的使用

假設有一個這樣的場景:

  • 有一個接口 MyInterfaceDefault,這個接口有一個抽象方法 method秫逝,同樣的恕出,在 IDEA 里修飾符 public是灰色的,可以省略:

    public interface MyInterfaceDefault {
        public abstract void method();
    }
    
  • 有兩個類實現了這個接口违帆,分別是 MyInterfaceDefaultAMyInterfaceDefaultB

    public class MyInterfaceDefaultA implements MyInterfaceDefault {
        @Override
        public void method() {
            System.out.println("抽象方法,AAAAAA");
        }
    }
    
    public class MyInterfaceDefaultA implements MyInterfaceDefault {
        @Override
        public void method() {
            System.out.println("抽象方法,BBBBBB");
        }
    }
    

這時候我想在接口中添加一個新的方法 method2浙巫,但是如果添加了這個方法,就得在兩個實現類里再實現這個方法,非常麻煩的畴。

如何解決這個問題渊抄?定一個默認方法(JDK 1.8 版本及以上):

public interface MyInterfaceDefault {
    public abstract void method();
    // 添加一個默認方法
    public default void method2() {
        // 方法體
        System.out.println("我是默認方法");
    }
}

這樣的話就不用在實現類里實現這個方法了,就很棒~

注意事項

  • 默認方法可以通過接口實現類對象丧裁,直接調用
  • 也可以被接口實現類進行覆蓋重寫

接口中靜態(tài)方法的定義格式

從 JDK 8 開始护桦,接口里允許定義靜態(tài)方法,也有方法體煎娇。

定義格式如下:

public static 返回值類型 方法名稱(參數列表) {
    方法體...
}

靜態(tài)方法的使用

首先定一個接口 MyInterfaceStatic二庵,里面有一個靜態(tài)方法,如果使用的是 IDEA 進行開發(fā)缓呛,修飾符 public也可以省略:

public interface MyInterfaceStatic {
    public static void method() {
        System.out.println("我是靜態(tài)方法");
    }
}

直接在類中使用即可眨猎,不用再定一個接口實現類:

public class Main {
    public static void main(String[] args) {
        // 接口名稱.方法名稱();
        MyInterfaceStatic.method();
    }
}

輸出結果:

我是靜態(tài)方法

注意事項

  • 不能通過接口實現類的對象來調用接口當中的靜態(tài)方法
  • 通過接口名稱,直接調用其中的靜態(tài)方法
  • 僅限于 JDK 版本在 1.8 及以上

接口中常量的定義格式

接口當中也可以定義"成員變量"强经,但必須通過 public static final這三個關鍵字進行修飾,從效果上看寺渗,這其實就是接口的常量匿情。

接口的常量定義格式如下:

public static final 數據類型 常量名稱 = 數據值;

一旦使用 final關鍵字進行修飾,就說明不可改變信殊。

這其實就是一個常量炬称,一旦賦值,就不可以更改涡拘。

常量的使用

定義一個接口 MyInterfaceConst玲躯,如果使用 IDEA 進行開發(fā), public static final是灰色的鳄乏,代表可以省略:

public interface MyInterfaceConst {
   public static final int NUM = 10;
}

跟靜態(tài)方法一樣跷车,直接在類中使用即可:

public class Main {
    public static void main(String[] args) {
        System.out.println(MyInterfaceConst.NUM);
    }
}

輸出結果:

10

注意事項

  • 接口當中的常量,必須進行賦值
  • 常量名稱按照習慣使用大寫字母橱野,用下劃線進行分隔

多個接口的實現

多個接口實現的格式:

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
    // 覆蓋重寫所有抽象方法(接口 A 的和接口 B 的)
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-b6xqfsyR-1608263215258)(https://wx2.sbimg.cn/2020/06/19/Snipaste_2020-06-19_19-02-40.png)]

注意事項

  • 如果實現類所實現的多個接口中朽缴,存在重復的抽象方法,那么只需要覆蓋重寫一次即可
  • 如果實現類所實現的多個接口中水援,存在重復的默認方法密强,那么實現類一定要對沖突的默認方法進行覆蓋重寫
  • 一個類的父類當中的方法和接口當中的默認方法產生沖突的話,優(yōu)先用父類中的方法(父類優(yōu)先蜗元,接口其次
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末或渤,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子奕扣,更是在濱河造成了極大的恐慌薪鹦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惯豆,死亡現場離奇詭異距芬,居然都是意外死亡涝开,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門框仔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舀武,“玉大人,你說我怎么就攤上這事离斩∫眨” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵跛梗,是天一觀的道長寻馏。 經常有香客問我,道長核偿,這世上最難降的妖魔是什么诚欠? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮漾岳,結果婚禮上轰绵,老公的妹妹穿的比我還像新娘。我一直安慰自己尼荆,他們只是感情好左腔,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捅儒,像睡著了一般液样。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巧还,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天鞭莽,我揣著相機與錄音,去河邊找鬼麸祷。 笑死撮抓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的摇锋。 我是一名探鬼主播丹拯,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荸恕!你這毒婦竟也來了乖酬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤融求,失蹤者是張志新(化名)和其女友劉穎咬像,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡县昂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年肮柜,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒彰。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡审洞,死狀恐怖,靈堂內的尸體忽然破棺而出待讳,到底是詐尸還是另有隱情芒澜,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布创淡,位于F島的核電站痴晦,受9級特大地震影響,放射性物質發(fā)生泄漏琳彩。R本人自食惡果不足惜誊酌,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望露乏。 院中可真熱鬧碧浊,春花似錦、人聲如沸施无。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猾骡。三九已至,卻和暖如春敷搪,著一層夾襖步出監(jiān)牢的瞬間兴想,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工赡勘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫂便,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓闸与,卻偏偏與公主長得像毙替,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子践樱,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容