你們口中的接口是什麼

先從一個通俗的解釋看起 (原文:C# 接口《通俗解釋》)

如果你的工作是一個修水管的,一天客戶找上你讓你幫裝水管,但是有個要求,就是客戶喜歡管子是三角形的。

你立馬買了三角形的水管回來,在牆上弄個三角形的口子,客戶付了錢,你很開心今天有了收入
在這裏插入圖片描述
但是好景不長,客戶過了一個星期又來找,因爲他覺得三角形不好看,要讓你換成正方形的水管,你不得不換,因爲顧客就是上帝。好吧,繼續在牆上弄個正方形的口子,然後又換成正方形的管子來接上。好了,如下圖:(但是可能覺得爲什麼一開始不說要正方形的?因爲需求總在變化。。。)
在這裏插入圖片描述
你累得滿頭大汗,但是還是完成了。可惜不久,客戶又來找你,因爲他想換成橢圓形的管子了。雖然你很無奈,但是你還是不得不花了幾個小時完成。如下圖:
在這裏插入圖片描述
安裝完成,這時你可能在考慮,爲什麼換不同形狀的水管,我都要大動干戈一番呢?於是你想到一個好方法,那就是牆上設計一個固定的水管並且是圓形的,當客戶喜歡什麼形狀的水管,那麼我只需要把客戶喜歡的水管的一頭做成圓形的,這樣,以後都不需要去動牆上的水管了。這是一個好辦法。就先在牆上弄個圓形的口,這個口就叫做接口。如下圖:
在這裏插入圖片描述
如你所見,牆上有個圓形的口,但是按照原本的:

三角形水管兩端是三角形
正方形水管兩端是正方形
橢圓形水管兩端是橢圓形

那是肯定接不上的,因爲三角形、正方形、橢圓形的口怎麼和牆壁上圓形的口對接呢?

所以先要實現接口,把:

三角形水管一端做成圓形
正方形水管一端做成圓形
橢圓形水管一端做成圓形

如圖,所以,圓形接口做出來了,具體實現是客戶去安裝,接口本身並不會安裝其他形狀的水管,換句話說就是接口沒有具體實現,只是告訴你,你的水管要接入,必須有一端是圓形的(接口的約束),因爲我只留這個圓形的接口,你要裝別的形狀的管子,先把一個弄成圓形的就好了(子類去實現接口的方法),不管什麼形狀,都要一個必須做成圓形才能對接得上,它必須要你按照我的規範來做。這就是爲什麼新手會覺得接口什麼都不做,只定義接口,沒有任何實現,那不是多此一舉嗎?因爲它的實現是子類去完成。這樣只要客戶喜歡什麼形狀的水管,只要實現了我的接口(圓形),都能對接得上,而且改變起來也很方便,只要把水管扭上去就行了,不用在去給牆壁挖洞了。
接口的語法實現
爲了聲明一個接口,我們使用interface這個關鍵字,在接口中的所有方法都必須只聲明方法標識,而不要去聲明具體的方法體,因爲具體的方法體的實現是由繼承該接口的類來去實現的,因此,接口並不用管具體的實現。接口中的屬性默認爲Public Static Final.一個類實現這個接口必須實現這個接口中定義的所有的抽象方法。

一個簡單的接口就像這樣:擁有全局變量和抽象方法

在這裏插入圖片描述
爲了實現這個接口,我們使用implements關鍵詞去實現接口在這裏插入圖片描述
其中testClass類實現了我們上面剛纔定義的 in1 這個接口,既然你要實現接口,也就是實現接口代表的一種能力,那麼你就必須去實現接口給你規定的方法,只有把接口給你規定的抽象方法都給實現了,才承認你這個類實現了這個接口,實現了這個接口代表的某種功能。上圖實現了接口中規定的display()方法。
在這裏插入圖片描述
寫一個測試類,用來測試一下我們剛纔實現的這個接口,因爲testclass類的對象t實現了接口規定的display方法,那麼自然而然就可以調用display()方法咯。
在這裏插入圖片描述
接口的進一步理解
我們知道,如果某個設備需要向電腦中讀取或者寫入某些東西,這些設備一般都是採用USB方式與電腦連接的,我們發現,只要帶有USB功能的設備就可以插入電腦中使用了,那麼我們可以認爲USB就是一種功能,這種功能能夠做出很多的事情(實現很多的方法),其實USB就可以看做是一種標準,一種接口,只要實現了USB標準的設備我就認爲你已經擁有了USB這種功能。(因爲你實現了我USB標準中規定的方法),下面是具體的例子:

先聲明USB接口:其中規定了要實現USB接口就必須實現接口規定實現的read( )和write( )這兩個方法

interface USB {
    void read();

    void write();
}

然後在寫一個U盤類和一個鍵盤類,這兩個類都去實現USB接口。(實現其中的方法)

class YouPan implements USB {
    @Override
    public void read() {
        System.out.println("U盤正在通過USB功能讀取數據");
    }
    @Override
    public void write() {
        System.out.println("U盤正在通過USB功能寫入數據");
    }
}
這是U盤的具體實現。

class JianPan implements USB {
@Override
public void read() {
System.out.println(“鍵盤正在通過USB功能讀取數據”);
}
@Override
public void write() {
System.out.println(“鍵盤正在通過USB功能寫入數據”);
}
}
這是鍵盤的具體實現。

  那麼,現在U盤和鍵盤都實現了USB功能,也就是說U盤和鍵盤都能夠調用USB接口中規定的方法,並且他們實現的方式都不一樣。

我們在寫一個測試,來看看具體的實現:

public class Main {
public static void main(String[] args) {
//生成一個實現可USB接口(標準)的U盤對象
YouPan youPan = new YouPan();
//調用U盤的read( )方法讀取數據
youPan.read();
//調用U盤的write( )方法寫入數據
youPan.write();
//生成一個實現可USB接口(標準)的鍵盤對象
JianPan jianPan = new JianPan();
//調用鍵盤的read( )方法讀取數據
jianPan.read();
//調用鍵盤的write( )方法寫入數據
jianPan.write();
}
}

結果如下:
在這裏插入圖片描述
關於接口的幾個重點
我們不能直接去實例化一個接口,因爲接口中的方法都是抽象的,是沒有方法體的,這樣怎麼可能產生具體的實例呢?但是,我們可以使用接口類型的引用指向一個實現了該接口的對象,並且可以調用這個接口中的方法。因此,上圖中最後的方法調用我們還可以這樣寫:(實際上就是使用了Java中多態的特性)

public class Main {
    public static void main(String[] args) {
        //生成一個實現可USB接口(標準)的U盤對象
        //但是使用一個接口引用指向對象
        //USB接口類引用可以指向一個實現了USB接口的對象
        USB youPan = new YouPan();
        //調用U盤的read( )方法讀取數據
        youPan.read();
        //調用U盤的write( )方法寫入數據
        youPan.write();
        //生成一個實現可USB接口(標準)的鍵盤對象
        //但是使用一個接口引用指向對象
        //USB接口類引用可以指向一個實現了USB接口的對象
        USB jianPan = new JianPan();
        //調用鍵盤的read( )方法讀取數據
        jianPan.read();
        //調用鍵盤的write( )方法寫入數據
        jianPan.write();
    }
}                                             
 2.一個類可以實現不止一個接口。

 

3.一個接口可以繼承於另一個接口,或者另一些接口,接口也可以繼承,並且可以多繼承。

4.一個類如果要實現某個接口的話,那麼它必須要實現這個接口中的所有方法。

5.接口中所有的方法都是抽象的和public的,所有的屬性都是public,static,final的。

6.接口用來彌補類無法實現多繼承的侷限。

7.接口也可以用來實現解耦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章