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

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

什么是接口呢谤碳?先來(lái)看一個(gè)現(xiàn)實(shí)中的栗子,我們常用的插座溢豆,一般分為兩孔和三孔蜒简,所以基本上不管是什么電器,只要插頭插進(jìn)去就可以正常使用沫换,想想看臭蚁,如果沒(méi)有這樣的規(guī)范,有十幾種不同的插座孔讯赏,每個(gè)電器的插頭都不一樣垮兑,還不得崩潰掉。

先來(lái)看個(gè)栗子:

/**

* @author Frank

* @create 2017/11/22

* @description 可比較接口漱挎,用于實(shí)現(xiàn)類對(duì)象排序

*/

public interface Isortable {

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

int compareWith(Object a,Object b);

}

這是一個(gè)簡(jiǎn)單的接口磕谅,使用interface關(guān)鍵字來(lái)定義接口私爷。

接口是描述可屬于任何類或者結(jié)構(gòu)的一組行為,是用于定義程序的一種規(guī)范膊夹,任何實(shí)現(xiàn)了接口的類都必須實(shí)現(xiàn)接口的所有方法衬浑,體現(xiàn)的是“如果你是。放刨。工秩。就必須能。进统。助币。”的思想螟碎。

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

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

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

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

而接口則是更高層的抽象洋丐,主要是對(duì)于行為的抽象,可以把它看作是一組規(guī)范或者要求挥等,就好比要開車就要先考駕照友绝,這個(gè)駕照就相當(dāng)于接口,你有了這個(gè)駕照肝劲,就代表你有開車的能力和資格迁客,因?yàn)椤叭绻阋旭{照,你就必須能開車“辞槐。這樣交警就不會(huì)為難你了掷漱,你跟交警之間通過(guò)駕照這個(gè)接口進(jìn)行交流和溝通,而不是用口才去說(shuō)服他榄檬。想一想卜范,如果沒(méi)有駕照這種規(guī)范,總不能沒(méi)見到一個(gè)開車的人都要先當(dāng)場(chǎng)測(cè)試一下他的能力才能讓他上路吧鹿榜。

在復(fù)雜的系統(tǒng)構(gòu)架中海雪,往往分成很多層級(jí)锦爵,上層要使用下層提供的服務(wù),而層級(jí)之間是通過(guò)接口進(jìn)行交流的奥裸,上層對(duì)于下層僅僅是接口的依賴险掀,而不是具體類的依賴,因?yàn)橹灰獙?shí)現(xiàn)了相應(yīng)的接口湾宙,就可以提供相應(yīng)的服務(wù)樟氢,就像只要有教師資格證,就代表你有當(dāng)老師的資格和本事侠鳄,關(guān)注的不是你這個(gè)對(duì)象埠啃,而是你教書的能力,也就是你能提供的服務(wù)畦攘。當(dāng)下層需要改變的時(shí)候霸妹,只要接口不變,上層可以完全不用改變知押,甚至可以在上層不知情的情況下完全換掉下層代碼哪廓,正因?yàn)榻涌诘拇嬖诟险铮寣蛹?jí)之間的耦合度大大降低改淑。就像你的U盤宠互,如果舊的壞了,直接換上新的U盤就可以插上静盅,即插即用良价,電腦跟U盤之間通過(guò)接口進(jìn)行交流。

好了蒿叠,說(shuō)了這么多明垢,真是很羅嗦,還是來(lái)看代碼吧市咽,實(shí)踐出真知痊银。我們來(lái)把上一篇的內(nèi)容稍做修改,上面的代碼定義了一個(gè)Isortable接口施绎,用于比較兩個(gè)對(duì)象溯革,以用于之后的排序。

然后我們定義一個(gè)Sort類谷醉,用于進(jìn)行排序致稀,可以使用各種類型的排序,如冒泡排序俱尼,選擇排序抖单,快速排序,希爾排序,這里簡(jiǎ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類中實(shí)現(xiàn)Isortable接口蔑歌。使用implements關(guān)鍵字。

/**

* @author Frank

* @create 2017/11/21

* @description

*/

public abstract class Goods implements Isortable{

//定義各個(gè)類共有的屬性

private String title;

private Double price;

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

public Goods(String title, Double price) {

this.title = title;

this.price = price;

}

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

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();

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

@Override

public int compareWith(Object a) {

//由于還沒(méi)有說(shuō)明泛型次屠,所以直接強(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類實(shí)現(xiàn)了Isortable接口,所以繼承于Goods類的所有類也都實(shí)現(xiàn)了該接口雳刺,接下來(lái)我們修改一下測(cè)試類進(jìn)行測(cè)試劫灶。

/**

* @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

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

其實(shí)在Java中已經(jīng)有類似的接口了雀久,Comparable接口和Comparator接口宿稀,因?yàn)槭褂昧朔盒停筒粫?huì)像這里的代碼需要強(qiáng)制類型轉(zhuǎn)換了(而且強(qiáng)制類型轉(zhuǎn)換也有一定風(fēng)險(xiǎn))赖捌,而很多方法可以對(duì)實(shí)現(xiàn)了Comparable接口的類進(jìn)行排序祝沸,這就很棒了。(手動(dòng)滑稽)

在實(shí)際使用中越庇,往往每個(gè)人都會(huì)負(fù)責(zé)不同的模塊開發(fā)罩锐,不同的模塊之間通常用接口進(jìn)行交流,因?yàn)槿绻鸄程序員開發(fā)A1類卤唉,需要使用B程序員開發(fā)的B1類涩惑,若是直接調(diào)用B1類,那就只能先等B1類開發(fā)好之后才能進(jìn)行A1類的開發(fā)搬味,而且如果B1類有任何改動(dòng)境氢,很可能需要修改A1類的代碼,這樣耦合度就很高了碰纬,而如果使用接口的話萍聊,A1類只需要接受接口類型的參數(shù),就可以直接調(diào)用相應(yīng)的方法悦析,而B1類只需要實(shí)現(xiàn)接口即可寿桨,B1類即使有改動(dòng),只要接口不變,那么它向A1類提供的服務(wù)也不會(huì)變亭螟,這樣A1類就不需要進(jìn)行改變挡鞍,耦合度就降低了。

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

接口是對(duì)一組特定行為的抽象预烙,是一種規(guī)范墨微,只能有方法簽名,而不能有實(shí)現(xiàn)扁掸,所有的方法默認(rèn)為abstract翘县,且訪問(wèn)權(quán)限只能是public,不能有普通成員變量谴分,可以有靜態(tài)成員變量锈麸,接口可以繼承接口,一個(gè)類可以實(shí)現(xiàn)一個(gè)接口牺蹄,也可以實(shí)現(xiàn)多個(gè)接口忘伞,接口的存在可以降低程序的耦合度,增加程序的靈活性沙兰。引用大神的話便是氓奈,接口和實(shí)現(xiàn)分離,面向接口編程僧凰。

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓖康,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垒手,更是在濱河造成了極大的恐慌蒜焊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件科贬,死亡現(xiàn)場(chǎng)離奇詭異泳梆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門优妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乘综,“玉大人,你說(shuō)我怎么就攤上這事套硼】ǔ剑” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵邪意,是天一觀的道長(zhǎng)看政。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抄罕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任于颖,我火速辦了婚禮呆贿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘森渐。我一直安慰自己做入,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布同衣。 她就那樣靜靜地躺著竟块,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耐齐。 梳的紋絲不亂的頭發(fā)上浪秘,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音埠况,去河邊找鬼耸携。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辕翰,可吹牛的內(nèi)容都是我干的夺衍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喜命,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沟沙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起壁榕,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矛紫,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后护桦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含衔,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贪染。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缓呛。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杭隙,靈堂內(nèi)的尸體忽然破棺而出哟绊,到底是詐尸還是另有隱情,我是刑警寧澤痰憎,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布票髓,位于F島的核電站,受9級(jí)特大地震影響铣耘,放射性物質(zhì)發(fā)生泄漏洽沟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一蜗细、第九天 我趴在偏房一處隱蔽的房頂上張望裆操。 院中可真熱鬧,春花似錦炉媒、人聲如沸踪区。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缎岗。三九已至,卻和暖如春白粉,著一層夾襖步出監(jiān)牢的瞬間传泊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鸭巴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留或渤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓奕扣,卻偏偏與公主長(zhǎng)得像薪鹦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惯豆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 貌似對(duì)幼時(shí)記憶的越早池磁,可能越聰明,這點(diǎn)來(lái)看我應(yīng)該比較笨楷兽,因?yàn)?歲以前的基本不太記得地熄,妹妹就比較厲害了,記得七...
    二狗先生的閑言碎語(yǔ)閱讀 220評(píng)論 0 0
  • 天剛蒙蒙亮芯杀,還在睡夢(mèng)中的妞妞就被鬧鐘叫醒端考。 她真不想醒過(guò)來(lái)雅潭,夢(mèng)里真好。在夢(mèng)里她見到爸爸了却特,雖然樣子模糊她都沒(méi)看清他...
    流失的青春閱讀 1,452評(píng)論 87 90
  • 曾經(jīng)一朋友問(wèn)過(guò)我一個(gè)問(wèn)題裂明,那就是努力到底能不能改變自己的命運(yùn)椿浓。這個(gè)問(wèn)題讓我想起了初三認(rèn)識(shí)的一個(gè)同學(xué)——李。 ...
    周先森_閱讀 250評(píng)論 1 4
  • 雪是北方大地純潔的白色精靈闽晦,也是小孩子們最喜歡的東西扳碍。 我的家鄉(xiāng)就在北方,冬天到了仙蛉,一開門笋敞,明媚的陽(yáng)光反射進(jìn)我的眼...
    許方則閱讀 261評(píng)論 0 0