Java-接口

基本概念

接口(Interface),在Java編程語言中是一個(gè)抽象類型琐旁,是抽象方法的集合。接口通常以interface來聲明信殊。一個(gè)類通過繼承接口的方式挽绩,從而來繼承接口的抽象方法。

如果一個(gè)類只由抽象方法和全局常量組成堰塌,那么這種情況下不會(huì)將其定義為一個(gè)抽象類赵刑。只會(huì)定義為一個(gè)接口,所以接口嚴(yán)格的來講屬于一個(gè)特殊的類场刑,而這個(gè)類里面只有抽象方法和全局常量料睛,就連構(gòu)造方法也沒有。

例子摇邦,定義一個(gè)接口

interface C{//定義一個(gè)接口

public static final String MSG = "hello";//全局常量
public abstract void print();//抽象方法

}
接口的使用

1.由于接口里面存在抽象方法恤煞,所以接口對(duì)象不能直接使用關(guān)鍵字new進(jìn)行實(shí)例化。接口的使用原則如下:
(1)接口必須要有子類施籍,但此時(shí)一個(gè)子類可以使用implements關(guān)鍵字實(shí)現(xiàn)多個(gè)接口居扒;
(2)接口的子類(如果不是抽象類),那么必須要覆寫接口中的全部抽象方法
(3)接口的對(duì)象可以利用子類對(duì)象的向上轉(zhuǎn)型進(jìn)行實(shí)例化

舉例:

interface C{//定義一個(gè)接口

    public static final String MSG = "hello";//全局常量

     public abstract void print();//抽象方法

}

interface D{
    public abstract void get();
}

class X implements C,D{

    @Override
    public void print() {
        System.out.println("接口C的抽象方法print()");
    }

    @Override
    public void get() {
        System.out.println("接口D的抽象方法get()");
    }
}

class TestDemo{
    public static void main(String[] args){
    
        X x = new X();//實(shí)例化子類對(duì)象
        C a = x;//向上轉(zhuǎn)型
        D b = x;//向上轉(zhuǎn)型
    
        a.print();
        b.get();
    }    
}

運(yùn)行結(jié)果

接口C的抽象方法print()
接口D的抽象方法get()

以上的代碼實(shí)例化了X類的對(duì)象丑慎,由于X類是A和B的子類喜喂,那么X類的對(duì)象可以變?yōu)锳接口或者B接口對(duì)象。我們把測試主類代碼改一下

class TestDemo{
    public static void main(String[] args){

       C a = new X();

       D b = (D) a;
       b.get();
    }
}

運(yùn)行結(jié)果為

接口D的抽象方法get()

再做一個(gè)驗(yàn)證

class TestDemo{
    public static void main(String[] args){

       C a = new X();

       D b = (D) a;
       b.get();

       System.out.println(a instanceof C);
       System.out.println(a instanceof D);
    }
}

運(yùn)行結(jié)果為

接口D的抽象方法get()
true
true

我們發(fā)現(xiàn)竿裂,從定義結(jié)構(gòu)來講玉吁,A和B兩個(gè)接口沒有任何直接聯(lián)系,但這兩個(gè)接口卻擁有同一個(gè)子類腻异。我們不要被類型和名稱所迷惑进副,因?yàn)閷?shí)例化的是X子類,而這個(gè)類對(duì)象屬于B類對(duì)象悔常,所以以上代碼可行影斑,只不過從代碼的編寫規(guī)范來講,并不是很好机打。

2.對(duì)于子類而言矫户,除了實(shí)現(xiàn)接口外,還可以繼承抽象類残邀。若既要繼承抽象類皆辽,同時(shí)還要實(shí)現(xiàn)接口的話柑蛇,使用一個(gè)語法格式

class 子類 [extends 父類][implements 接口1,接口2]{}

范例

interface E{
    public static String MSG = "hello";

    public abstract void print();//抽象方法
}

interface F{
    public abstract void get();
}

 abstract class G{
    public abstract void change();
}

class X extends G implements E,F{

@Override
public void print() {
    System.out.println("接口E的抽象方法");
    }

    @Override
    public void get() {
    System.out.println("接口F的抽象方法");
    }

    @Override
    public void change() {
        System.out.println("抽象類G的抽象方法");
        }
   }

對(duì)于接口驱闷,里面的組成只有抽象方法和全局常量唯蝶,所以很多時(shí)候?yàn)榱藭鴮懞唵危梢圆挥脤憄ublic abstract或者public static final遗嗽。并且粘我,接口中的訪問權(quán)限只有一種:public ,即:定義接口方法和全局常量的時(shí)候就算沒有寫上public,那么最終的訪問權(quán)限也是public痹换,注意不是default征字,注意不是default。以下兩種寫法是完全等價(jià)的:

interface C{
    public static final String MSG = "hello";
    public abstract void print();
}

等價(jià)于

interface C{
     String MSG = "hello";
     void print();
}

但是娇豫,這樣會(huì)不會(huì)帶來什么問題呢匙姜?如果子類中的覆寫方法也不是public,我們來看:

interface C{
     String MSG = "hello";
 
     void print();
}

class X implements C{
    void print(){
        System.out.println("接口C的抽象方法");
    }
}

public class TestDemo{
    public static void main(String[] args){
    
        C c = new X();
        c.print();
    }
}

這樣運(yùn)行冯痢,系統(tǒng)會(huì)報(bào)錯(cuò)氮昧,這是因?yàn)榻涌谥心J(rèn)是public修飾,若子類中沒有public修飾浦楣,則訪問權(quán)限變嚴(yán)格了袖肥,給子類分配的是更低的訪問權(quán)限。所以振劳,在定義接口的時(shí)候強(qiáng)烈建議在抽象方法前加上public椎组,子類也加上

3.在Java中,一個(gè)抽象類只能繼承一個(gè)抽象類历恐,但一個(gè)接口卻可以使用extends關(guān)鍵字同時(shí)繼承多個(gè)接口(但接口不能繼承抽象類)寸癌。
(1)一個(gè)抽象類只能繼承一個(gè)抽象父類,而接口可以繼承多個(gè)接口弱贼;
(2)一個(gè)子類只能繼承一個(gè)抽象類蒸苇,卻可以實(shí)現(xiàn)多個(gè)接口(Java中,接口的主要功能時(shí)解決單繼承局限問題)

4.從接口的概念來講吮旅,接口只能由抽象方法和全局常量組成溪烤,但是內(nèi)部結(jié)構(gòu)時(shí)不受概念限制的,正如抽象類中可以定義抽象內(nèi)部類一樣鸟辅,在接口中也可以定義普通內(nèi)部類氛什、抽象內(nèi)部類和內(nèi)部接口

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匪凉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捺檬,老刑警劉巖再层,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡聂受,警方通過查閱死者的電腦和手機(jī)蒿秦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋济,“玉大人棍鳖,你說我怎么就攤上這事⊥肼茫” “怎么了渡处?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祟辟。 經(jīng)常有香客問我医瘫,道長,這世上最難降的妖魔是什么旧困? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任醇份,我火速辦了婚禮,結(jié)果婚禮上吼具,老公的妹妹穿的比我還像新娘僚纷。我一直安慰自己,他們只是感情好拗盒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布畔濒。 她就那樣靜靜地躺著,像睡著了一般锣咒。 火紅的嫁衣襯著肌膚如雪侵状。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天毅整,我揣著相機(jī)與錄音趣兄,去河邊找鬼。 笑死悼嫉,一個(gè)胖子當(dāng)著我的面吹牛艇潭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戏蔑,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹋凝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了总棵?” 一聲冷哼從身側(cè)響起鳍寂,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎情龄,沒想到半個(gè)月后迄汛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捍壤,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年鞍爱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹃觉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睹逃,死狀恐怖盗扇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沉填,我是刑警寧澤疗隶,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拜轨,受9級(jí)特大地震影響抽减,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橄碾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一卵沉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧法牲,春花似錦史汗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悼瓮,卻和暖如春戈毒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背横堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工埋市, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人命贴。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓道宅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胸蛛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子污茵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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