java入門學(xué)習(xí)提升第二篇:接口

上一篇講完了抽象類,這一篇主要講解比抽象類更加抽象的內(nèi)容——接口。

什么是接口呢?先來看一個現(xiàn)實中的栗子,我們常用的插座,一般分為兩孔和三孔,所以基本上不管是什么電器,只要插頭插進(jìn)去就可以正常使用,想想看,如果沒有這樣的規(guī)范,有十幾種不同的插座孔,每個電器的插頭都不一樣,還不得崩潰掉。

先來看個栗子:

/**

* @author Frank

* @create 2017/11/22

* @description 可比較接口,用于實現(xiàn)類對象排序

*/

public interface Isortable {

//a>b則返回正整數(shù),相等則返回0,否則返回負(fù)整數(shù)

int compareWith(Object a,Object b);

}

這是一個簡單的接口,使用interface關(guān)鍵字來定義接口。

接口是描述可屬于任何類或者結(jié)構(gòu)的一組行為,是用于定義程序的一種規(guī)范,任何實現(xiàn)了接口的類都必須實現(xiàn)接口的所有方法,體現(xiàn)的是“如果你是。。。就必須能。。?!钡乃枷搿?/p>

在接口中,不能有方法的實現(xiàn),也就是說,里面所有方法都是public abstract的,里面只能由靜態(tài)變量,不能存在普通成員變量,可謂是抽象的集大成者。那為什么要使用接口呢?

還是繼續(xù)我們之前的比喻,任何按照規(guī)范進(jìn)行生產(chǎn)的插頭都能獲得電力,而不同插座雖然生產(chǎn)工藝不同,質(zhì)量也不一樣,但并不影響電器的正常使用,電器并不會關(guān)心插座的內(nèi)部實現(xiàn),這樣就能屏蔽掉一些底層的細(xì)節(jié),只暴露出接口供電器使用。

對于軟件開發(fā)而言,按照接口的規(guī)范進(jìn)行調(diào)用,就能獲得期望的功能,按照接口的規(guī)范實現(xiàn)接口的方法,就能提供所期望的功能。接口的意義在于抽象,而抽象可以很好的解耦合。

我們來回頭看看上一篇的栗子,我們從具體的商品類中抽象出了一個商品類,從而實現(xiàn)了代碼復(fù)用和統(tǒng)一管理,也降低了程序的耦合度,比如一個排序方法,參數(shù)設(shè)置為Phone類的話,那就只能往里面放Phone類型的對象,而如果設(shè)置成Goods類,則Phone、Television、Computer類的對象都可以傳入進(jìn)去,這樣就降低了程序的耦合度,也就是相互之間的依賴度。

而接口則是更高層的抽象,主要是對于行為的抽象,可以把它看作是一組規(guī)范或者要求,就好比要開車就要先考駕照,這個駕照就相當(dāng)于接口,你有了這個駕照,就代表你有開車的能力和資格,因為“如果你要有駕照,你就必須能開車“。這樣交警就不會為難你了,你跟交警之間通過駕照這個接口進(jìn)行交流和溝通,而不是用口才去說服他。想一想,如果沒有駕照這種規(guī)范,總不能沒見到一個開車的人都要先當(dāng)場測試一下他的能力才能讓他上路吧。

在復(fù)雜的系統(tǒng)構(gòu)架中,往往分成很多層級,上層要使用下層提供的服務(wù),而層級之間是通過接口進(jìn)行交流的,上層對于下層僅僅是接口的依賴,而不是具體類的依賴,因為只要實現(xiàn)了相應(yīng)的接口,就可以提供相應(yīng)的服務(wù),就像只要有教師資格證,就代表你有當(dāng)老師的資格和本事,關(guān)注的不是你這個對象,而是你教書的能力,也就是你能提供的服務(wù)。當(dāng)下層需要改變的時候,只要接口不變,上層可以完全不用改變,甚至可以在上層不知情的情況下完全換掉下層代碼,正因為接口的存在,讓層級之間的耦合度大大降低。就像你的U盤,如果舊的壞了,直接換上新的U盤就可以插上,即插即用,電腦跟U盤之間通過接口進(jìn)行交流。

好了,說了這么多,真是很羅嗦,還是來看代碼吧,實踐出真知。我們來把上一篇的內(nèi)容稍做修改,上面的代碼定義了一個Isortable接口,用于比較兩個對象,以用于之后的排序。

然后我們定義一個Sort類,用于進(jìn)行排序,可以使用各種類型的排序,如冒泡排序,選擇排序,快速排序,希爾排序,這里簡單起見,只用了冒泡排序。

/**

* @author Frank

* @create 2017/11/22

* @description 排序類

*/

public class Sort {

//冒泡排序,從大到小排序

public static void bubbleSort(Isortable[] isortables){

for (int i = 0;i

for(int j = 0;j

if(isortables[j].sort(isortables[j+1])<0){

//交換兩者的值

Isortable tmp = isortables[j+1];

isortables[j+1] = isortables[j];

isortables[j] = tmp;

}

}

}

}

}

然后在Goods類中實現(xiàn)Isortable接口。使用implements關(guān)鍵字。

/**

* @author Frank

* @create 2017/11/21

* @description

*/

public abstract class Goods implements Isortable{

//定義各個類共有的屬性

private String title;

private Double price;

//定義構(gòu)造器

public Goods(String title, Double price) {

this.title = title;

this.price = price;

}

//定義設(shè)置器和訪問器

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public Double getPrice() {

return price;

}

public void setPrice(Double price) {

this.price = price;

}

//聲明抽象打印方法

abstract void print();

//實現(xiàn)Isortable接口,覆蓋compareWith方法

@Override

public int compareWith(Object a) {

//由于還沒有說明泛型,所以直接強(qiáng)制轉(zhuǎn)換類型了

Goods g = (Goods)a;

if(this.price > g.getPrice()){

return 1;

}else if(this.price < g.getPrice()){

return -1;

}

return 0;

}

}

由于Goods類實現(xiàn)了Isortable接口,所以繼承于Goods類的所有類也都實現(xiàn)了該接口,接下來我們修改一下測試類進(jìn)行測試。

/**

* @author Frank

* @create 2017/11/21

* @description

*/

public class Test {

public static void main(String[] args) {

Goods[] goodsList = new Goods[3];

goodsList[0] = new Phone("IphoneX",9688.00,5.8,24.0);

goodsList[1] = new Computer("Alienware15C-R2738",17699.00,"i7-7700HQ","GTX1060");

goodsList[2] = new Television("SAMSUNG UA78KU6900JXXZ",21999.00,78.0,"4K");

Sort.bubbleSort(goodsList);

for (Goods g:goodsList)

System.out.println(g.getTitle()+" "+g.getPrice());

}

}

輸出如下:

SAMSUNG UA78KU6900JXXZ 21999.0

Alienware15C-R2738 17699.0

IphoneX 9688.0

這樣就按價格進(jìn)行了從大到小的排序了,怎么樣,接口用起來很簡單方便吧,這樣以后Goods類不管有多少子類,都可以用Sort的bubbleSort方法進(jìn)行排序,還可以修改或者增加Sort類的方法,讓它按你想要的規(guī)則進(jìn)行排序。

其實在Java中已經(jīng)有類似的接口了,Comparable接口和Comparator接口,因為使用了泛型,就不會像這里的代碼需要強(qiáng)制類型轉(zhuǎn)換了(而且強(qiáng)制類型轉(zhuǎn)換也有一定風(fēng)險),而很多方法可以對實現(xiàn)了Comparable接口的類進(jìn)行排序,這就很棒了。(手動滑稽)

在實際使用中,往往每個人都會負(fù)責(zé)不同的模塊開發(fā),不同的模塊之間通常用接口進(jìn)行交流,因為如果A程序員開發(fā)A1類,需要使用B程序員開發(fā)的B1類,若是直接調(diào)用B1類,那就只能先等B1類開發(fā)好之后才能進(jìn)行A1類的開發(fā),而且如果B1類有任何改動,很可能需要修改A1類的代碼,這樣耦合度就很高了,而如果使用接口的話,A1類只需要接受接口類型的參數(shù),就可以直接調(diào)用相應(yīng)的方法,而B1類只需要實現(xiàn)接口即可,B1類即使有改動,只要接口不變,那么它向A1類提供的服務(wù)也不會變,這樣A1類就不需要進(jìn)行改變,耦合度就降低了。

現(xiàn)在小結(jié)一下:

接口是對一組特定行為的抽象,是一種規(guī)范,只能有方法簽名,而不能有實現(xiàn),所有的方法默認(rèn)為abstract,且訪問權(quán)限只能是public,不能有普通成員變量,可以有靜態(tài)成員變量,接口可以繼承接口,一個類可以實現(xiàn)一個接口,也可以實現(xiàn)多個接口,接口的存在可以降低程序的耦合度,增加程序的靈活性。引用大神的話便是,接口和實現(xiàn)分離,面向接口編程。

至此,接口講解完畢,歡迎大家繼續(xù)關(guān)注。

真正重要的東西,用眼睛是看不見的。

小編推薦一個學(xué)Java的學(xué)習(xí)裙【 四九四,八零一,九三一 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 貌似對幼時記憶的越早,可能越聰明,這點(diǎn)來看我應(yīng)該比較笨,因為6歲以前的基本不太記得,妹妹就比較厲害了,記得七...
    二狗先生的閑言碎語閱讀 288評論 0 0
  • 天剛蒙蒙亮,還在睡夢中的妞妞就被鬧鐘叫醒。 她真不想醒過來,夢里真好。在夢里她見到爸爸了,雖然樣子模糊她都沒看清他...
    流失的青春閱讀 1,540評論 87 90
  • 曾經(jīng)一朋友問過我一個問題,那就是努力到底能不能改變自己的命運(yùn)。這個問題讓我想起了初三認(rèn)識的一個同學(xué)——李。 ...
    周先森_閱讀 303評論 1 4
  • 雪是北方大地純潔的白色精靈,也是小孩子們最喜歡的東西。 我的家鄉(xiāng)就在北方,冬天到了,一開門,明媚的陽光反射進(jìn)我的眼...
    許方則閱讀 281評論 0 0

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