Java基礎(chǔ):接口

目錄:
一、 接口的概念
二阱洪、 接口的聲明
三便贵、 接口的實(shí)現(xiàn)
四、 接口中成員變量的特點(diǎn)
五冗荸、 接口中成員方法的特點(diǎn)
六承璃、 類(lèi)和接口的多實(shí)現(xiàn)
七、 接口的繼承
八蚌本、接口與類(lèi)的區(qū)別:
九盔粹、 抽象類(lèi)和接口的區(qū)別
十、 接口中的方法是否可以被重載和覆蓋程癌?
十一舷嗡、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)
十二、 標(biāo)記接口


一嵌莉、 接口的概念

  • 接口是功能的集合咬崔,同樣可看做是一種特殊的數(shù)據(jù)類(lèi)型,是比抽象類(lèi)更為抽象的類(lèi)烦秩。
  • 接口只描述所應(yīng)該具備的方法垮斯,并沒(méi)有具體實(shí)現(xiàn),具體的實(shí)現(xiàn)由接口的實(shí)現(xiàn)類(lèi)(相當(dāng)于接口的子類(lèi))來(lái)完成只祠。這樣將功能的定義與實(shí)現(xiàn)分離兜蠕,優(yōu)化了程序設(shè)計(jì)。
  • 記着浊蕖:一切事物均有功能熊杨,即一切事物均有接口

二曙旭、 接口的聲明

  • 使用 interface 代替了原來(lái)的 class 其他步驟與定義類(lèi)相同
public interface 接口名稱(chēng) extends 其他的類(lèi)/接口名 {  
        //聲明變量  
        //抽象方法  
}
  • 接口是隱式抽象的,當(dāng)聲明一個(gè)接口的時(shí)候晶府,不必使用abstract關(guān)鍵字桂躏。

三、 接口的實(shí)現(xiàn)

  • 當(dāng)類(lèi)實(shí)現(xiàn)接口的時(shí)候川陆,類(lèi)要實(shí)現(xiàn)接口中所有的方法剂习。否則,類(lèi)必須聲明為抽象類(lèi)较沪。
  • 類(lèi)使用implements關(guān)鍵字實(shí)現(xiàn)接口.
  • 一個(gè)類(lèi)如果實(shí)現(xiàn)接口, 有兩種操作方法:
    • 實(shí)現(xiàn)類(lèi)為非抽象類(lèi), 就需要重寫(xiě)接口中所有的抽象方法.
    • 實(shí)現(xiàn)類(lèi)為抽象類(lèi), 可以不重寫(xiě)接口中的抽象方法鳞绕。
class 類(lèi) implements 接口1,接口2... {
    //重寫(xiě)接口中方法
} 

四、 接口中成員變量的特點(diǎn)

  • 接口中無(wú)法定義普通的成員變量.
  • 接口中定義的變量尸曼,必須有固定的修飾符修飾public static final 们何,所以接口中的變量也稱(chēng)之為常量,其值不能改變控轿。

static 可以被類(lèi)名冤竹、接口名直接調(diào)用
final 最終,固定住變量的值

  • public static final 在接口中可以省略不寫(xiě)茬射,也可以選擇性寫(xiě)贴见,但是不代表沒(méi)有.
  • 接口中的成員變量必須顯式初始化.
interface Demo { ///定義一個(gè)名稱(chēng)為Demo的接口。
    public static final int NUM = 3;// NUM的值不能改變
}

五躲株、 接口中成員方法的特點(diǎn)

  • 接口中的成員都是 public 的片部,不能指定其它的訪問(wèn)控制修飾符
  • 接口中成員方法定義的固定格式: public abstract 返回值類(lèi)型 方法名字(參數(shù)列表)
  • 子類(lèi)必須覆蓋接口中所有的抽象方法后,子類(lèi)才可以實(shí)例化,否則子類(lèi)是一個(gè)抽象類(lèi)霜定。

六档悠、 類(lèi)和接口的多實(shí)現(xiàn)

  • 類(lèi)和接口的多實(shí)現(xiàn)是接口最重要的體現(xiàn):解決多繼承的弊端。將多繼承這種機(jī)制在 java 中通過(guò)多實(shí)現(xiàn)完成了望浩。

多繼承的弊端
多繼承時(shí)辖所,當(dāng)多個(gè)父類(lèi)中有相同功能時(shí),子類(lèi)調(diào)用會(huì)產(chǎn)生不確定性磨德。
其實(shí)核心原因就是在于多繼承父類(lèi)中功能有主體缘回,而導(dǎo)致調(diào)用運(yùn)行時(shí),不確定運(yùn)行哪個(gè)主體內(nèi)容典挑。

  • 為什么多實(shí)現(xiàn)能解決酥宴? 因?yàn)榻涌谥械墓δ芏紱](méi)有方法體,都是由子類(lèi)/實(shí)現(xiàn)類(lèi)重寫(xiě)來(lái)明確

七您觉、 接口的繼承

  • 一個(gè)接口能繼承另一個(gè)接口拙寡,和類(lèi)之間的繼承方式比較相似。接口的繼承使用extends關(guān)鍵字琳水,子接口繼承父接口的方法肆糕。
  • 在Java中般堆,類(lèi)的多繼承是不合法,但接口允許多繼承诚啃。

八淮摔、接口與類(lèi)的區(qū)別:

  • 接口不能用于實(shí)例化對(duì)象。
  • 接口沒(méi)有構(gòu)造方法始赎。
  • 接口中所有的方法必須是抽象方法和橙。
  • 接口不能包含普通成員變量,除了 staticfinal 變量极阅。
  • 接口不是被類(lèi)繼承了胃碾,而是要被類(lèi)實(shí)現(xiàn)涨享。
  • 接口支持多繼承筋搏。

九、 抽象類(lèi)和接口的區(qū)別

1. 相同點(diǎn)
  • 抽象類(lèi)和接口都位于繼承的頂端,用于被其他類(lèi)實(shí)現(xiàn)或繼承.
  • 不能直接實(shí)例化對(duì)象.
  • 都包含抽象方法,其子類(lèi)都必須覆蓋這些抽象方法.
2. 區(qū)別
  • 抽象類(lèi)中的方法可以有方法體厕隧,就是能實(shí)現(xiàn)方法的具體功能奔脐,但是接口中的方法不行。
  • 抽象類(lèi)中的成員變量可以是各種類(lèi)型的吁讨,而接口中的成員變量只能是 public static final類(lèi)型的髓迎。
  • 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類(lèi)是可以有靜態(tài)代碼塊和靜態(tài)方法建丧。
  • 一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)排龄,而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。
3. 二者的選擇:
  • 優(yōu)先選用接口,盡量少用抽象類(lèi);
  • 需要定義子類(lèi)的行為,又要為子類(lèi)提供共性功能時(shí)才選用抽象類(lèi);

十翎朱、 接口中的方法是否可以被重載和覆蓋橄维?

  • 重載: 對(duì)于接口中的方法重載,重載條件和普通類(lèi)沒(méi)有任何區(qū)別拴曲,只是重載的方法沒(méi)有方法體
  • 覆蓋: 接口中的方法也可以覆蓋(Override)争舞,但沒(méi)有實(shí)際的意義,因?yàn)榻涌谥胁惶峁┓椒ǖ膶?shí)現(xiàn)

十一澈灼、 接口的新特性——默認(rèn)方法和靜態(tài)方法(jdk8之后)

1. 默認(rèn)方法
  • 可以在不影響已有類(lèi)的情況下竞川,修改接口
  • 可以有方法實(shí)現(xiàn)
  • 父類(lèi)中的默認(rèn)方法可以被子接口繼承
  • 子接口可以覆蓋父接口中的默認(rèn)方法,甚至還可以把父接口中的默認(rèn)方法覆蓋為抽象方法
  • 實(shí)現(xiàn)接口后叁熔,因?yàn)槟J(rèn)方法不是抽象方法委乌,所以可以不重寫(xiě),但是如果開(kāi)發(fā)需要荣回,也可以重寫(xiě)
  • 默認(rèn)方法使用default 關(guān)鍵字福澡,只能通過(guò)接口實(shí)現(xiàn)類(lèi)的對(duì)象來(lái)調(diào)用。
  • 注意:默認(rèn)方法的訪問(wèn)權(quán)限也是默認(rèn)public
2. 靜態(tài)方法
  • 可以有方法實(shí)現(xiàn)
  • 可以直接通過(guò)接口名來(lái)訪問(wèn)
  • 靜態(tài)方法沒(méi)有方法覆蓋驹马,因?yàn)殪o態(tài)方法沒(méi)有運(yùn)行時(shí)多態(tài)
interface Test{
    //這個(gè)是默認(rèn)方法
    default String get(String aa){
        System.out.println("我是jdk1.8默認(rèn)實(shí)現(xiàn)方法...");
        return "";
    }   
    //這個(gè)是靜態(tài)方法    
    static void staticmethod(){
        System.out.println("我是靜態(tài)方法");
    }
}
3. 注意事項(xiàng)
  • 接口默認(rèn)方法革砸、靜態(tài)方法可以有多個(gè)除秀。
  • 默認(rèn)方法通過(guò)實(shí)例調(diào)用,靜態(tài)方法通過(guò)接口名調(diào)用算利。
  • default 默認(rèn)方法關(guān)鍵字只能用在接口中册踩。
  • 默認(rèn)方法可以被繼承,如果繼承了多個(gè)接口效拭,多個(gè)接口都定義了多個(gè)同樣的默認(rèn)方法暂吉,實(shí)現(xiàn)類(lèi)需要重寫(xiě)默認(rèn)方法不然會(huì)報(bào)錯(cuò)。
  • 靜態(tài)方法不能被繼承及覆蓋缎患,所以只被具體所在的接口調(diào)用慕的。

十二、 標(biāo)記接口

  • 標(biāo)記接口是沒(méi)有任何方法和屬性的接口.
  • 它僅僅表明它的類(lèi)屬于一個(gè)特定的類(lèi)型,供其他代碼來(lái)測(cè)試允許做一些事情挤渔。
  • 標(biāo)記接口作用:簡(jiǎn)單形象的說(shuō)就是給某個(gè)對(duì)象打個(gè)標(biāo)(蓋個(gè)戳)肮街,使對(duì)象擁有某個(gè)或某些特權(quán)。
  • 例如:java.awt.event 包中的 MouseListener 接口繼承的 java.util.EventListener 接口定義如下:
package  java.util; 
public  interface  EventListener  {

}
  • 標(biāo)記接口主要用于以下兩種目的
    • 建立一個(gè)公共的父接口
      正如EventListener接口判导,這是由幾十個(gè)其他接口擴(kuò)展的Java API嫉父,你可以使用一個(gè)標(biāo)記接口來(lái)建立一組接口的父接口。 例如:當(dāng)一個(gè)接口繼承了EventListener接口眼刃,Java虛擬機(jī)(JVM)就知道該接口將要被用于一個(gè)事件的代理方案绕辖。

    • 向一個(gè)類(lèi)添加數(shù)據(jù)類(lèi)型
      這種情況是標(biāo)記接口最初的目的,實(shí)現(xiàn)標(biāo)記接口的類(lèi)不需要定義任何接口方法(因?yàn)闃?biāo)記接口根本就沒(méi)有方法)擂红,但是該類(lèi)通過(guò)多態(tài)性變成一個(gè)接口類(lèi)型仪际。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昵骤,隨后出現(xiàn)的幾起案子树碱,更是在濱河造成了極大的恐慌,老刑警劉巖涉茧,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴恨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伴栓,警方通過(guò)查閱死者的電腦和手機(jī)伦连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钳垮,“玉大人惑淳,你說(shuō)我怎么就攤上這事〗攘” “怎么了歧焦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绢馍,道長(zhǎng)向瓷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任舰涌,我火速辦了婚禮猖任,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓷耙。我一直安慰自己朱躺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布搁痛。 她就那樣靜靜地躺著长搀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸡典。 梳的紋絲不亂的頭發(fā)上源请,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音轿钠,去河邊找鬼巢钓。 笑死病苗,一個(gè)胖子當(dāng)著我的面吹牛疗垛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硫朦,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贷腕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咬展?” 一聲冷哼從身側(cè)響起泽裳,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎破婆,沒(méi)想到半個(gè)月后涮总,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祷舀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瀑梗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裳扯。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抛丽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饰豺,到底是詐尸還是另有隱情亿鲜,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布冤吨,位于F島的核電站蒿柳,受9級(jí)特大地震影響饶套,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垒探,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一凤跑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叛复,春花似錦仔引、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至撬码,卻和暖如春儿倒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呜笑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工夫否, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叫胁。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓凰慈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驼鹅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子微谓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361