接口interface
接口的作用
為什么需要接口?接口和抽象類的區(qū)別?
接口就是比“抽象類”還“抽象”的“抽象類”幅聘,可以更加規(guī)范的對(duì)子類進(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ù)抖棘。
接口是兩個(gè)模塊之間通信的標(biāo)準(zhǔn)茂腥,通信的規(guī)范。如果能把你要設(shè)計(jì)的系統(tǒng)之間模塊之間的接口定義好切省,就相當(dāng)于完成了系統(tǒng)的設(shè)計(jì)大綱最岗,剩下的就是添磚加瓦的具體實(shí)現(xiàn)了。大家在工作以后朝捆,做系統(tǒng)時(shí)往往就是使用“面向接口”的思想來設(shè)計(jì)系統(tǒng)般渡。
??
接口和實(shí)現(xiàn)類不是父子關(guān)系,是實(shí)現(xiàn)規(guī)則的關(guān)系。比如:我定義一個(gè)接口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ū)ο蟮木瑁菍?duì)對(duì)象的抽象碧信,最能體現(xiàn)這一點(diǎn)的就是接口赊琳。為什么我們討論設(shè)計(jì)模式都只針對(duì)具備了抽象能力的語言(比如C++、Java砰碴、C#等)躏筏,就是因?yàn)樵O(shè)計(jì)模式所研究的,實(shí)際上就是如何合理的去抽象呈枉。
區(qū)別
普通類:具體實(shí)現(xiàn)
抽象類:具體實(shí)現(xiàn)趁尼,規(guī)范(抽象方法)
接口:規(guī)范!?
如何定義和使用接口
聲明格式:
[訪問修飾符]??interface?接口名?? ? [extends??父接口1猖辫,父接口2…]? {
常量定義??????????????
方法定義
}
定義接口的詳細(xì)說明:
訪問修飾符:只能是public或默認(rèn)酥泞。
接口名:和類名采用相同命名機(jī)制
extends:接口可以多繼承
常量:接口中的屬性只能是常量,總是:public static final?修飾啃憎。不寫也是芝囤。
方法:接口中的方法只能是:public abstract。?省略的話,也是public abstract.?
要點(diǎn):
子類通過implements來實(shí)現(xiàn)接口中的規(guī)范
接口不能創(chuàng)建實(shí)例悯姊,但是可用于聲明引用變量類型名党。
一個(gè)類實(shí)現(xiàn)了接口,必須實(shí)現(xiàn)接口中所有的方法挠轴,并且這些方法只能是public的传睹。
?接口中只能包含靜態(tài)常量、抽象方法岸晦,不能有普通屬性欧啤、構(gòu)造方法、普通方法启上。?
【示例1】接口的使用
package?? com.bjsxt.javase;
public?class?? TestInterface {
????public?static?void?? main(String[] args) {
?????? Volant volant =?new?? Angel();
??? ??? volant.fly();
??????? System.out.println(Volant.FLY_HIGHT);
??? }
}
interface?? Volant { ??//飛行接口
????int?FLY_HIGHT?= ? 100;??// ??總是:public static final
????void?? fly();???//總是:public ? abstract void? fly();
}
interface?? Honest {?//善良接口
????void?? helpOther();
}
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("我是鳥人,正在飛包券!");
??? }
}
?
示例1 運(yùn)行效果圖
接口的多繼承
接口完全支持多繼承纫谅。和類的繼承類似,子接口擴(kuò)展某個(gè)父接口溅固,將會(huì)獲得父接口中所定義的一切付秕。
【示例2】接口的多繼承
interface?A{
????void?testa();
}
interface?B{
????void?testb();
}
interface?C?extends?A,B{
????void?testc();
}
public?class?Test?implements?C{
????public?void?testc() {
??? }
????public?void?testa() {
??? }
????public?void?testb() {
??? }
}
面向接口編程
面向接口編程是面向?qū)ο缶幊痰囊徊糠帧?/p>
為什么需要面向接口編程??軟件設(shè)計(jì)中最難處理的就是需求的復(fù)雜變化,需求的變化更多的體現(xiàn)在具體實(shí)現(xiàn)上侍郭。我們的編程如果圍繞具體實(shí)現(xiàn)來展開就會(huì)陷入”復(fù)雜變化”的汪洋大海中询吴,軟件也就不能最終實(shí)現(xiàn)。我們必須圍繞某種穩(wěn)定的東西開展亮元,才能以靜制動(dòng)猛计,實(shí)現(xiàn)規(guī)范的高質(zhì)量的項(xiàng)目。
接口就是規(guī)范爆捞,就是項(xiàng)目中最穩(wěn)定的東東奉瘤!?面向接口編程可以讓我把握住真正核心的東西,使實(shí)現(xiàn)復(fù)雜的多變的需求成為可能嵌削。
通過面向接口編程毛好,而不是面向?qū)崿F(xiàn)類編程,可以大大降低程序模塊間的耦合性苛秕,提高整個(gè)系統(tǒng)的可擴(kuò)展性和和可維護(hù)性肌访。
面向接口編程的概念比接口本身的概念要大得多。設(shè)計(jì)難了艇劫,在你沒有寫實(shí)現(xiàn)時(shí)就要想好接口吼驶,接口一變就亂套了,設(shè)計(jì)要比實(shí)現(xiàn)難!
老鳥建議
???接口語法本身非常簡(jiǎn)單蟹演,但是如何真正使用风钻?才是大學(xué)問。我們需要后面在項(xiàng)目中反復(fù)使用酒请,大家才能體會(huì)到骡技。?學(xué)到此處,能了解基本概念羞反,熟悉基本語法布朦,就是“好學(xué)生”了。?請(qǐng)繼續(xù)努力昼窗!再請(qǐng)工作后是趴,閑余時(shí)間再看看上面這段話,相信你會(huì)有更深的體會(huì)澄惊。
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記唆途。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn)掸驱,曾在神州數(shù)碼肛搬、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師亭敢、高級(jí)工程師滚婉、架構(gòu)師。精通Java平臺(tái)軟件開發(fā)帅刀,精通JAVAEE,熟悉各種流行開發(fā)框架远剩。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop?