詳解java接口interface

引言

接口這個詞在生活中我們并不陌生蒋搜。

在中國大陸篡撵,我們可以將自己的家用電器的插頭插到符合它插口的插座上判莉;

我們在戴爾,惠普育谬,聯(lián)想券盅,蘋果等品牌電腦之間傳輸數(shù)據(jù)時,可以使用U盤進(jìn)行傳輸膛檀。

插座的普適性是因為大部分都是國標(biāo)的锰镀;U盤可以插到這些電腦上,是因為都遵循了USB2.0或者USB3.0的標(biāo)準(zhǔn)咖刃。

在遵循相同標(biāo)準(zhǔn)的前提下互站,就出現(xiàn)了接口。

接口的定義

由引言可知僵缺,接口就是多個類之間的公共規(guī)范胡桃。

我們知道,普通類的定義是這樣的

public class 類名{
    
}

接口的定義把class換成interface便可以了,如下所示:

public interface 接口名{
    
}

接口中定義抽象方法

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

public abstract 方法返回類型 方法名();

其中public和abstract是可以省略的磕潮。從而翠胰,可以簡寫為如下形式:

方法返回類型 方法名();

接口的抽象方法的使用

接口是不能new對象實例的。那我們怎么調(diào)用接口的抽象方法呢自脯?

我們需要新定義一個類來實現(xiàn)這個接口之景,然后覆蓋重寫接口中所有的抽象方法。其中實現(xiàn)接口的類定義方式如下:

public class 類名 implements 需要實現(xiàn)的接口名{
 //重寫所有抽象方法
}

比如膏潮,可以定義一個接口和一個實現(xiàn)類,然后再定義一個類锻狗,來調(diào)用方法。

package com.sjdwz;

/**
 * @Description 接口示例代碼
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy1 {
    public abstract void test01();
}
package com.sjdwz;

/**
 * @Description MyInterfaceStudy1接口的實現(xiàn)
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy1Impl implements MyInterfaceStudy1{
    @Override
    public void test01() {
        System.out.println("實現(xiàn)了接口MyInterfaceStudy1的test01方法");
    }
}
package com.sjdwz;

/**
 * @Description 接口抽象方法使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest1 {
    public static void main(String[] args) {
        MyInterfaceStudy1Impl myInterfaceStudy1 = new MyInterfaceStudy1Impl();
        myInterfaceStudy1.test01();
    }
}

注意:如果沒有覆蓋重寫所有的抽象方法焕参,那么本實現(xiàn)類需要是一個抽象類轻纪。

接口中定義默認(rèn)方法

假設(shè)某場景下,我們的接口需要進(jìn)行升級叠纷,必須添加某些方法來滿足新的需要刻帚,如果我們再定義抽象方法的話,那么我們之前實現(xiàn)該接口的所有非抽象類都需要重新進(jìn)行修改涩嚣。

那么有沒有一種辦法崇众,能夠讓我們不改動接口實現(xiàn)類的代碼就能完成接口的升級呢?

在Java8中對此給出了答案航厚。

我們可以在接口中定義默認(rèn)方法顷歌。

定義方式如下:

public default 方法返回類型 方法名(){
    //方法里面需要執(zhí)行的內(nèi)容
}

public可以省略。

接口的默認(rèn)方法的使用

我們在定義接口的實現(xiàn)類時幔睬,不需要對默認(rèn)方法進(jìn)行覆蓋重寫眯漩,就可以使用該方法。請看如下的例子:

接口類的定義

package com.sjdwz;

/**
 * @Description 接口的默認(rèn)方法
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy2 {
    default void defaultFucTest01(){
        System.out.println("我在defaultFucTest01中溪窒,我是一個默認(rèn)方法坤塞,我解決了接口升級的問題");
    }
    void testAbstarct();
}

兩個實現(xiàn)類的定義

package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy2Impl implements MyInterfaceStudy2{
    @Override
    public void testAbstarct() {
        System.out.println("我在MyInterfaceStudy2Impl中冯勉,我重寫了MyInterfaceStudy2中的抽象方法");
    }
}
package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy2DefaultImpl implements MyInterfaceStudy2{
    @Override
    public void defaultFucTest01() {
        System.out.println("我在MyInterfaceStudy2DefaultImpl中,我重寫了MyInterfaceStudy2的默認(rèn)方法");
    }
    @Override
    public void testAbstarct() {
        System.out.println("我在MyInterfaceStudy2DefaultImpl中摹芙,我重寫了MyInterfaceStudy2的默認(rèn)方法");
    }
}

它們的使用:

package com.sjdwz;

/**
 * @Description TODO
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest2 {
    public static void main(String[] args) {
        MyInterfaceStudy2Impl myInterfaceStudy2 = new MyInterfaceStudy2Impl();
        myInterfaceStudy2.defaultFucTest01();
        myInterfaceStudy2.testAbstarct();

        MyInterfaceStudy2DefaultImpl myInterfaceStudy2Default = new MyInterfaceStudy2DefaultImpl();
        myInterfaceStudy2Default.defaultFucTest01();
        myInterfaceStudy2Default.testAbstarct();
    }
}

輸出如下:

輸出

由此可見灼狰,接口實現(xiàn)類如果沒有重寫接口中的默認(rèn)方法,會去調(diào)用接口中的默認(rèn)方法浮禾;如果實現(xiàn)類重寫了接口的默認(rèn)方法交胚,便會調(diào)用重寫的方法。

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

定義方式如下

public static 方法返回類型 方法名(){
    //方法里面需要執(zhí)行的內(nèi)容
}

public可以省略

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

定義接口如下:

package com.sjdwz;
/**
 * @Description 接口中的靜態(tài)方法
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy3 {
    static void staticFuc(){
        System.out.println("我在MyInterfaceStudy3接口中盈电,這是我的靜態(tài)方法");
    }
}

該接口的實現(xiàn)類如下

package com.sjdwz;

/**
 * @Description 實現(xiàn)類
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy3Impl implements MyInterfaceStudy3{
}

如果我使用方式如下可以嗎蝴簇?

錯誤使用

強大的Java編輯器已經(jīng)幫我們提示錯誤了。這樣使用是不可以的匆帚。

正確使用方式時接口名.靜態(tài)方法名(參數(shù))熬词;

package com.sjdwz;

/**
 * @Description 接口靜態(tài)方法的使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest3 {
    public static void main(String[] args) {
        MyInterfaceStudy3.staticFuc();
    }
}

輸出如下

接口中靜態(tài)方法的輸出

接口中定義常量

定義方式如下

public static final 數(shù)據(jù)類型 常量名 = 666;

其中public static final可以省略吸重。

一般常量名的每個字母都大寫互拾,如果時多個單詞,使用下劃線連接嚎幸。

如下所示:

int NUM = 666;
int DAILY_HOURS = 24;

接口中常量的使用

定義接口如下:

package com.sjdwz;
/**
 * @Description 接口中定義常量
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public interface MyInterfaceStudy4 {
    int NUM = 666;
    int DAILY_HOURS = 24;
}

實現(xiàn)類如下

package com.sjdwz;

/**
 * @Description 實現(xiàn)類
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudy4Impl {
}

我們可以使用如下嗎颜矿?

錯誤使用

很明顯,又提示錯誤了嫉晶。不能使用實現(xiàn)類.常量實現(xiàn)類的對象.常量來使用骑疆。

正確使用如下:

package com.sjdwz;

/**
 * @Description 接口的常量使用測試
 * @Date 2022/3/17
 * @Created by 隨機的未知 sjdwz.com
 */
public class MyInterfaceStudyTest4 {
    public static void main(String[] args) {
        System.out.println("用接口來訪問接口中的常量NUM:======"+MyInterfaceStudy4.NUM);
        System.out.println("用接口來方法接口中的常量DAILY_HOURS:======"+MyInterfaceStudy4.DAILY_HOURS);
    }
}

輸出如下:

輸出

原文鏈接為:https://sjdwz.com/11171.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市替废,隨后出現(xiàn)的幾起案子箍铭,更是在濱河造成了極大的恐慌,老刑警劉巖舶担,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坡疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡衣陶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門闸氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剪况,“玉大人,你說我怎么就攤上這事蒲跨∫攵希” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵或悲,是天一觀的道長孙咪。 經(jīng)常有香客問我堪唐,道長,這世上最難降的妖魔是什么翎蹈? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任淮菠,我火速辦了婚禮,結(jié)果婚禮上荤堪,老公的妹妹穿的比我還像新娘合陵。我一直安慰自己,他們只是感情好澄阳,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布拥知。 她就那樣靜靜地躺著,像睡著了一般碎赢。 火紅的嫁衣襯著肌膚如雪低剔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天肮塞,我揣著相機與錄音户侥,去河邊找鬼。 笑死峦嗤,一個胖子當(dāng)著我的面吹牛蕊唐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烁设,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼替梨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了装黑?” 一聲冷哼從身側(cè)響起副瀑,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恋谭,沒想到半個月后糠睡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡疚颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年狈孔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片材义。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡均抽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出其掂,到底是詐尸還是另有隱情油挥,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站深寥,受9級特大地震影響攘乒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惋鹅,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一则酝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负饲,春花似錦堤魁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洞坑,卻和暖如春盲链,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迟杂。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工刽沾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人排拷。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓侧漓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親监氢。 傳聞我的和親對象是個殘疾皇子布蔗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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