從0開始學(xué)java(4.3.2)接口的作用和使用

為什么需要接口?接口和抽象類的區(qū)別?

接口就是比“抽象類”還“抽象”的“抽象類”,可以更加規(guī)范的對子類進(jìn)行約束。全面地專業(yè)地實(shí)現(xiàn)了:規(guī)范和具體實(shí)現(xiàn)的分離。
抽象類還提供某些具體實(shí)現(xiàn),接口不提供任何實(shí)現(xiàn),接口中所有方法都是抽象方法。接口是完全面向規(guī)范的,規(guī)定了一批類具有的公共方法規(guī)范。
從接口的實(shí)現(xiàn)者角度看,接口定義了可以向外部提供的服務(wù)。
從接口的調(diào)用者角度看,接口定義了實(shí)現(xiàn)者能提供那些服務(wù)。
接口是兩個模塊之間通信的標(biāo)準(zhǔn),通信的規(guī)范。如果能把你要設(shè)計(jì)的模塊之間的接口定義好,就相當(dāng)于完成了系統(tǒng)的設(shè)計(jì)大綱,剩下的就是添磚加瓦的具體實(shí)現(xiàn)了。大家在工作以后,做系統(tǒng)時往往就是使用“面向接口”的思想來設(shè)計(jì)系統(tǒng)。
接口和實(shí)現(xiàn)類不是父子關(guān)系,是實(shí)現(xiàn)規(guī)則的關(guān)系。比如:我定義一個接口Runnable,Car實(shí)現(xiàn)它就能在地上跑,Train實(shí)現(xiàn)它也能在地上跑,飛機(jī)實(shí)現(xiàn)它也能在地上跑。就是說,如果它是交通工具,就一定能跑,但是一定要實(shí)現(xiàn)Runnable接口。
· 接口的本質(zhì)探討
接口就是規(guī)范,定義的是一組規(guī)則,體現(xiàn)了現(xiàn)實(shí)世界中“如果你是…則必須能…”的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你是好人,則必須能干掉壞人;如果你是壞人,則必須欺負(fù)好人。
接口的本質(zhì)是契約,就像我們?nèi)碎g的法律一樣。制定好后大家都遵守。
面向?qū)ο蟮木瑁菍ο蟮某橄?,最能體現(xiàn)這一點(diǎn)的就是接口。為什么我們討論設(shè)計(jì)模式都只針對具備了抽象能力的語言(比如C++、Java、C#等),就是因?yàn)樵O(shè)計(jì)模式所研究的,實(shí)際上就是如何合理的去抽象。
區(qū)別
1. 普通類:具體實(shí)現(xiàn)
2. 抽象類:具體實(shí)現(xiàn),規(guī)范(抽象方法)
3. 接口:規(guī)范!

接口定義

[訪問修飾符] interface 接口名 [extends 父接口1,父接口2…] {
常量定義;
方法定義;
}
定義接口的詳細(xì)說明:
1. 訪問修飾符:只能是(abstract) public或默認(rèn)。
2. 接口名:和類名采用相同命名機(jī)制。
3. extends:接口可以多繼承。
4. 常量:接口中的屬性只能是常量,總是:public static final 修飾。不寫也是。
5. 方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。
要點(diǎn)
1. 子類通過implements來實(shí)現(xiàn)接口中的規(guī)范。
2. 接口不能創(chuàng)建實(shí)例,但是可用于聲明引用變量類型。
3. 一個類實(shí)現(xiàn)了接口,必須實(shí)現(xiàn)接口中所有的方法,并且這些方法只能是public的。
4. JDK1.7之前,接口中只能包含靜態(tài)常量、抽象方法,不能有普通屬性、構(gòu)造方法、普通方法。
5. JDK1.8后,接口中包含普通的靜態(tài)方法。

接口的使用

public class TestInterface {
    public static void main(String[] args) {
        Volant volant = new Angel();
        volant.fly();
        System.out.println(Volant.FLY_HIGHT);
         
        Honest honest = new GoodMan();
        honest.helpOther();
    }
}
/**飛行接口*/
interface Volant { 
    int FLY_HIGHT = 100;  // 總是:public static final類型的;
    void fly();   //總是:public abstract void fly();
}
/**善良接口*/
interface Honest { 
    void helpOther();
}
/**Angle類實(shí)現(xiàn)飛行接口和善良接口*/
class Angel implements Volant, Honest{
    public void fly() {
        System.out.println("我是天使,飛起來啦!");
    }
    public void helpOther() {
        System.out.println("扶老奶奶過馬路!");
    }
}
class GoodMan implements Honest {
   public void helpOther() {
        System.out.println("扶老奶奶過馬路!");
    }  
}
class BirdMan implements Volant {
    public void fly() {
        System.out.println("我是鳥人,正在飛!");
    }
}

接口的多繼承

接口完全支持多繼承。和類的繼承類似,子接口擴(kuò)展某個父接口,將會獲得父接口中所定義的一切。

interface A {
    void testa();
}
interface B {
    void testb();
}
/**接口可以多繼承:接口C繼承接口A和B*/
interface C extends A, B {
    void testc();
}
public class Test implements C {
    public void testc() {
    }
    public void testa() {
    }
    public void testb() {
    }
}

面向接口編程

面向接口編程是面向?qū)ο缶幊痰囊徊糠帧?br> 為什么需要面向接口編程? 軟件設(shè)計(jì)中最難處理的就是需求的復(fù)雜變化,需求的變化更多的體現(xiàn)在具體實(shí)現(xiàn)上。我們的編程如果圍繞具體實(shí)現(xiàn)來展開就會陷入”復(fù)雜變化”的汪洋大海中,軟件也就不能最終實(shí)現(xiàn)。我們必須圍繞某種穩(wěn)定的東西開展,才能以靜制動,實(shí)現(xiàn)規(guī)范的高質(zhì)量的項(xiàng)目。
接口就是規(guī)范,就是項(xiàng)目中最穩(wěn)定的東東! 面向接口編程可以讓我們把握住真正核心的東西,使實(shí)現(xiàn)復(fù)雜多變的需求成為可能。
通過面向接口編程,而不是面向?qū)崿F(xiàn)類編程,可以大大降低程序模塊間的耦合性,提高整個系統(tǒng)的可擴(kuò)展性和和可維護(hù)性。
面向接口編程的概念比接口本身的概念要大得多。設(shè)計(jì)階段相對比較困難,在你沒有寫實(shí)現(xiàn)時就要想好接口,接口一變就亂套了,所以設(shè)計(jì)要比實(shí)現(xiàn)難!
老鳥建議
接口語法本身非常簡單,但是如何真正使用?這才是大學(xué)問。我們需要后面在項(xiàng)目中反復(fù)使用,大家才能體會到。 學(xué)到此處,能了解基本概念,熟悉基本語法,就是“好學(xué)生”了。 請繼續(xù)努力!再請工作后,閑余時間再看看上面這段話,相信你會有更深的體會。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容