App下載

java接口是什么

猿友 2021-01-28 14:12:42 瀏覽數(shù) (6442)
反饋

接口概念

    官方解釋?zhuān)篔ava 接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒(méi)有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類(lèi)實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。

    我的解釋?zhuān)航涌诳梢岳斫鉃橐环N特殊的類(lèi),里面全部是由全局常量和公共的抽象方法所組成。接口是解決 Java 無(wú)法使用多繼承的一種手段,但是接口在實(shí)際中更多的作用是制定標(biāo)準(zhǔn)的?;蛘呶覀兛梢灾苯影呀涌诶斫鉃?00%的抽象類(lèi),既接口中的方法必須全部是抽象方法。(JDK1.8之前可以這樣理解)

接口的特點(diǎn)

    就像一個(gè)類(lèi)一樣,一個(gè)接口也能夠擁有方法和屬性,但是在接口中聲明的方法默認(rèn)是抽象的。(即只有方法標(biāo)識(shí)符,而沒(méi)有方法體)。

  • 接口指明了一個(gè)類(lèi)必須要做什么和不能做什么,相當(dāng)于類(lèi)的藍(lán)圖。
  • 一個(gè)接口就是描述一種能力,比如“運(yùn)動(dòng)員”也可以作為一個(gè)接口,并且任何實(shí)現(xiàn)“運(yùn)動(dòng)員”接口的類(lèi)都必須有能力實(shí)現(xiàn)奔跑這個(gè)動(dòng)作(或者 implement move()方法),所以接口的作用就是告訴類(lèi),你要實(shí)現(xiàn)我這種接口代表的功能,你就必須實(shí)現(xiàn)某些方法,我才能承認(rèn)你確實(shí)擁有該接口代表的某種能力。
  • 如果一個(gè)類(lèi)實(shí)現(xiàn)了一個(gè)接口中要求的所有的方法,然而沒(méi)有提供方法體而僅僅只有方法標(biāo)識(shí),那么這個(gè)類(lèi)一定是一個(gè)抽象類(lèi)。(必須記?。撼橄蠓椒ㄖ荒艽嬖谟诔橄箢?lèi)或者接口中,但抽象類(lèi)中卻能存在非抽象方法,即有方法體的方法。接口是百分之百的抽象類(lèi))
  • 一個(gè) JAVA 庫(kù)中接口的例子是:Comparator 接口,這個(gè)接口代表了“能夠進(jìn)行比較”這種能力,任何類(lèi)只要實(shí)現(xiàn)了這個(gè)Comparator 接口的話(huà),這個(gè)類(lèi)也具備了“比較”這種能力,那么就可以用來(lái)進(jìn)行排序操作了。

為什么要用接口

  1.     接口被用來(lái)描述一種抽象。
  2. 因?yàn)?Java 不像C++一樣支持多繼承,所以 Java 可以通過(guò)實(shí)現(xiàn)接口來(lái)彌補(bǔ)這個(gè)局限。
  3. 接口也被用來(lái)實(shí)現(xiàn)解耦。
  4. 接口被用來(lái)實(shí)現(xiàn)抽象,而抽象類(lèi)也被用來(lái)實(shí)現(xiàn)抽象,為什么一定要用接口呢?接口和抽象類(lèi)之間又有什么區(qū)別呢?原因是抽象類(lèi)內(nèi)部可能包含非 final 的變量,但是在接口中存在的變量一定是 final,public,static 的。

接口的語(yǔ)法實(shí)現(xiàn)

    為了聲明一個(gè)接口,我們使用 interface 這個(gè)關(guān)鍵字,在接口中的所有方法都必須只聲明方法標(biāo)識(shí),而不要去聲明具體的方法體,因?yàn)榫唧w的方法體的實(shí)現(xiàn)是由繼承該接口的類(lèi)來(lái)去實(shí)現(xiàn)的,因此,接口并不用管具體的實(shí)現(xiàn)。接口中的屬性默認(rèn)為 Public Static Final.一個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口必須實(shí)現(xiàn)這個(gè)接口中定義的所有的抽象方法。

    一個(gè)簡(jiǎn)單的接口就像這樣:擁有全局變量和抽象方法。

微信截圖_20210128134552

    為了實(shí)現(xiàn)這個(gè)接口,我們使用 implements 關(guān)鍵詞去實(shí)現(xiàn)接口:

微信截圖_20210128134613

其中 testClass 類(lèi)實(shí)現(xiàn)了我們上面剛才定義的 in1 這個(gè)接口,既然你要實(shí)現(xiàn)接口,也就是實(shí)現(xiàn)接口代表的一種能力,那么你就必須去實(shí)現(xiàn)接口給你規(guī)定的方法,只有把接口給你規(guī)定的抽象方法都給實(shí)現(xiàn)了,才承認(rèn)你這個(gè)類(lèi)實(shí)現(xiàn)了這個(gè)接口,實(shí)現(xiàn)了這個(gè)接口代表的某種功能。上圖實(shí)現(xiàn)了接口中規(guī)定的 display()方法。

微信截圖_20210128134631

    寫(xiě)一個(gè)測(cè)試類(lèi),用來(lái)測(cè)試一下我們剛才實(shí)現(xiàn)的這個(gè)接口,因?yàn)閠estclass類(lèi)的對(duì)象t實(shí)現(xiàn)了接口規(guī)定的 display 方法,那么自然而然就可以調(diào)用 display()方法咯。
微信截圖_20210128134725

    有興趣的同學(xué)可以去這個(gè)在線(xiàn)IDE親自試一試:點(diǎn)擊打開(kāi)鏈接

 

 

接口的進(jìn)一步理解

 

    我們知道,如果某個(gè)設(shè)備需要向電腦中讀取或者寫(xiě)入某些東西,這些設(shè)備一般都是采用 USB 方式與電腦連接的,我們發(fā)現(xiàn),只要帶有 USB 功能的設(shè)備就可以插入電腦中使用了,那么我們可以認(rèn)為USB就是一種功能,這種功能能夠做出很多的事情(實(shí)現(xiàn)很多的方法),其實(shí) USB 就可以看做是一種標(biāo)準(zhǔn),一種接口,只要實(shí)現(xiàn)了USB標(biāo)準(zhǔn)的設(shè)備我就認(rèn)為你已經(jīng)擁有了 USB 這種功能。(因?yàn)槟銓?shí)現(xiàn)了我 USB 標(biāo)準(zhǔn)中規(guī)定的方法),下面是具體的例子:

 

先聲明USB接口:其中規(guī)定了要實(shí)現(xiàn)USB接口就必須實(shí)現(xiàn)接口規(guī)定實(shí)現(xiàn)的 read( )和 write( )這兩個(gè)方法。

interface USB {    void read();    void write();}

然后在寫(xiě)一個(gè)U盤(pán)類(lèi)和一個(gè)鍵盤(pán)類(lèi),這兩個(gè)類(lèi)都去實(shí)現(xiàn) USB 接口。(實(shí)現(xiàn)其中的方法)

class YouPan implements USB {   
@Override    
public void read() {       
System.out.println("U盤(pán)正在通過(guò)USB功能讀取數(shù)據(jù)");    }    
@Override    
public void write() {       
System.out.println("U盤(pán)正在通過(guò)USB功能寫(xiě)入數(shù)據(jù)");    }}
這是U盤(pán)的具體實(shí)現(xiàn)。
class JianPan implements USB {    
@Override    
public void read() {       
System.out.println("鍵盤(pán)正在通過(guò)USB功能讀取數(shù)據(jù)");    }    
@Override    
public void write() {       
System.out.println("鍵盤(pán)正在通過(guò)USB功能寫(xiě)入數(shù)據(jù)");    }}

 

這是鍵盤(pán)的具體實(shí)現(xiàn)。

那么,現(xiàn)在U盤(pán)和鍵盤(pán)都實(shí)現(xiàn)了 USB 功能,也就是說(shuō) U 盤(pán)和鍵盤(pán)都能夠調(diào)用 USB 接口中規(guī)定的方法,并且他們實(shí)現(xiàn)的方式都不一樣。

我們?cè)趯?xiě)一個(gè)測(cè)試,來(lái)看看具體的實(shí)現(xiàn):

public class Main {    
public static void main(String[] args) {        
//生成一個(gè)實(shí)現(xiàn)可USB接口(標(biāo)準(zhǔn))的U盤(pán)對(duì)象        
YouPan youPan = new YouPan();        
//調(diào)用U盤(pán)的read( )方法讀取數(shù)據(jù)        
youPan.read();        
//調(diào)用U盤(pán)的write( )方法寫(xiě)入數(shù)據(jù)        
youPan.write();        
//生成一個(gè)實(shí)現(xiàn)可USB接口(標(biāo)準(zhǔn))的鍵盤(pán)對(duì)象        
JianPan jianPan = new JianPan();        
//調(diào)用鍵盤(pán)的read( )方法讀取數(shù)據(jù)        
jianPan.read();        
//調(diào)用鍵盤(pán)的write( )方法寫(xiě)入數(shù)據(jù)        
jianPan.write();    }} 

 

結(jié)果如下:

 

微信截圖_20210128135818

 

    感興趣的同學(xué)可以去在線(xiàn)IDE平臺(tái)自己驗(yàn)證一下:點(diǎn)擊打開(kāi)鏈接

關(guān)于接口的幾個(gè)重點(diǎn)

  1. 我們不能直接去實(shí)例化一個(gè)接口,因?yàn)榻涌谥械姆椒ǘ际浅橄蟮?,是沒(méi)有方法體的,這樣怎么可能產(chǎn)生具體的實(shí)例呢?但是,我們可以使用接口類(lèi)型的引用指向一個(gè)實(shí)現(xiàn)了該接口的對(duì)象,并且可以調(diào)用這個(gè)接口中的方法。因此,上圖中最后的方法調(diào)用我們還可以這樣寫(xiě):(實(shí)際上就是使用了 Java 中多態(tài)的特性)
public class Main {    
public static void main(String[] args) {        
//生成一個(gè)實(shí)現(xiàn)可USB接口(標(biāo)準(zhǔn))的U盤(pán)對(duì)象       
//但是使用一個(gè)接口引用指向?qū)ο?nbsp;      
//USB接口類(lèi)引用可以指向一個(gè)實(shí)現(xiàn)了USB接口的對(duì)象        
USB youPan = new YouPan();        
//調(diào)用U盤(pán)的read( )方法讀取數(shù)據(jù)        
youPan.read();        
//調(diào)用U盤(pán)的write( )方法寫(xiě)入數(shù)據(jù)        
youPan.write();        
//生成一個(gè)實(shí)現(xiàn)可USB接口(標(biāo)準(zhǔn))的鍵盤(pán)對(duì)象       
//但是使用一個(gè)接口引用指向?qū)ο?nbsp;      
//USB接口類(lèi)引用可以指向一個(gè)實(shí)現(xiàn)了USB接口的對(duì)象        
USB jianPan = new JianPan();        
//調(diào)用鍵盤(pán)的read( )方法讀取數(shù)據(jù)        
jianPan.read();        
//調(diào)用鍵盤(pán)的write( )方法寫(xiě)入數(shù)據(jù)        
jianPan.write();    }}                                                                                                                                     

 

2.一個(gè)類(lèi)可以實(shí)現(xiàn)不止一個(gè)接口。

3.一個(gè)接口可以繼承于另一個(gè)接口,或者另一些接口,接口也可以繼承,并且可以多繼承。

4.一個(gè)類(lèi)如果要實(shí)現(xiàn)某個(gè)接口的話(huà),那么它必須要實(shí)現(xiàn)這個(gè)接口中的所有方法。

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

6.接口用來(lái)彌補(bǔ)類(lèi)無(wú)法實(shí)現(xiàn)多繼承的局限。

7.接口也可以用來(lái)實(shí)現(xiàn)解耦。

接口的通俗理解

 

    前面我們講多態(tài)的時(shí)候用“空調(diào)”——“遙控器”的方式去理解多態(tài),實(shí)際上在上面的的幾個(gè)重點(diǎn)中的第一條講的也是多態(tài)的實(shí)現(xiàn),比如,我們可以把“節(jié)能”作為一種標(biāo)準(zhǔn),或者說(shuō)節(jié)能就是一個(gè)“接口”,這個(gè)接口中有一個(gè)方法,叫做變頻方法,任何空調(diào),如果要稱(chēng)得上叫做節(jié)能空調(diào)的話(huà),那么必須實(shí)現(xiàn)“節(jié)能”這個(gè)接口,實(shí)現(xiàn)“節(jié)能”這個(gè)接口,也就必須實(shí)現(xiàn)“節(jié)能”接口中規(guī)定實(shí)現(xiàn)的“變頻”方法,這樣才算是真正的實(shí)現(xiàn)了“節(jié)能”這個(gè)接口,實(shí)現(xiàn)了“節(jié)能”這個(gè)功能。

    當(dāng)某個(gè)空調(diào)實(shí)現(xiàn)了“節(jié)能”接口后,這個(gè)空調(diào)就具備了節(jié)能的功能,那么我們也可以不用空調(diào)類(lèi)的引用指向空調(diào)對(duì)象,我們可以直接使用一個(gè)“節(jié)能”接口類(lèi)型引用的“遙控器”去指向“空調(diào)”,雖然這個(gè)“遙控器”上面只有一個(gè)按鍵,只有一個(gè)“變頻”的方法,但是“遙控器”所指向的空調(diào)是實(shí)現(xiàn)了“節(jié)能”這個(gè)接口的,是有“變頻”方法的實(shí)現(xiàn)的,我們用這個(gè)只有一個(gè)“變頻”方法的遙控器去命令空調(diào)調(diào)用“變頻”方法,也是行得通的。

 

接口的標(biāo)識(shí)用法

    雖然接口內(nèi)部定義了一些抽象方法,但是并不是所有的接口內(nèi)部都必須要有方法,比如 Seriallizable 接口,Seriallizable 接口的作用是使對(duì)象能夠“序列化”,但是 Seriallizable 接口中卻沒(méi)有任何內(nèi)容,也就是說(shuō),如果有一個(gè)類(lèi)需要實(shí)現(xiàn)“序列化”的功能,則這個(gè)類(lèi)必須去實(shí)現(xiàn) Seriallizable 接口,但是卻并不用實(shí)現(xiàn)方法(因?yàn)榻涌谥袥](méi)有方法),此時(shí),這個(gè) Serilizable 接口就僅僅是一個(gè)“標(biāo)識(shí)”接口,是用來(lái)標(biāo)志一個(gè)類(lèi)的,標(biāo)志這個(gè)類(lèi)具有這個(gè)“序列化”功能。具體的實(shí)現(xiàn)請(qǐng)參考我的另一篇文章——JAVA 之 IO 流。

 

接口在生活中的思想體現(xiàn)

其實(shí),在我們的生活當(dāng)中,有很多地方都體現(xiàn)了“接口”的思想,想必,正在閱讀這篇博文的你,是不是也喜歡攝影呢?

佳能(Canon)EOS 80D 單反相機(jī) 單反套機(jī)(EF-S 18-200mm f/3.5-5.6 IS 單反鏡頭)

玩攝影的童鞋都知道,單反由相機(jī)和鏡頭組成,相機(jī)分不同的型號(hào),有半畫(huà)幅的,也有全畫(huà)幅的。鏡頭也是一樣的,分長(zhǎng)焦,短焦;還有定焦和變焦。每種鏡頭都有各自特定的發(fā)揮場(chǎng)景。正是因?yàn)殓R頭的多元化,使得我們的攝影能夠“術(shù)業(yè)有專(zhuān)攻”。大家想一想,如果我們的單反相機(jī)部分和鏡頭部分是固定在一起的,不能夠更換鏡頭,那么將會(huì)多么的糟糕??!

因此,每個(gè)相機(jī)品牌為了能夠兼容不同的鏡頭,各自發(fā)布了一套鏡頭卡口的標(biāo)準(zhǔn),這套標(biāo)準(zhǔn)就好比我們前面提到的“接口”,都是某種“約束”。舉個(gè)栗子,我們佳能的相機(jī),不管你是哪一家鏡頭生產(chǎn)廠(chǎng)商,騰龍也好,適馬也好,只要你按照我佳能卡口的標(biāo)準(zhǔn)來(lái)生產(chǎn)鏡頭,你生產(chǎn)的鏡頭都能夠很好的在我佳能相機(jī)上面驅(qū)動(dòng)。

微信截圖_20210128134858

因此,當(dāng)我們打開(kāi)“某東”,準(zhǔn)備給自己的新相機(jī)買(mǎi)鏡頭的時(shí)候,就不難發(fā)現(xiàn),我們需要根據(jù)自己相機(jī)的品牌來(lái)挑選特定卡口的鏡頭,這樣的鏡頭才能被我們的相機(jī)正常驅(qū)動(dòng)。

微信截圖_20210128134930

回到 Java 上面來(lái)說(shuō),其實(shí)接口給我們帶來(lái)的最大的好處就是“解耦”了,相機(jī)能夠搭配不同的鏡頭,才能有各種各樣的搭配玩法,變得更加的靈活。在軟件系統(tǒng)中也是一樣的,接口可以有很多不同“特色”的實(shí)現(xiàn)類(lèi),我們只需要聲明同一個(gè)接口,卻可以引用很多個(gè)該“接口”引申出來(lái)的“子類(lèi)”,這不也大大增強(qiáng)了我們軟件系統(tǒng)中組件的靈活性嗎?

聰明的你,對(duì)于“接口”的理解是不是又更加的深入了呢?

 


0 人點(diǎn)贊