編程人員是最勤快的人,也是最懶惰的一群人,總是不斷地學(xué)習(xí),能夠自動(dòng)完成的絕對(duì)不會(huì)手寫。要成為合格的Java全棧工程師?請(qǐng)完全理解Java的編程思想! 接口interface關(guān)鍵字使抽象的概念更向前邁進(jìn)了一部。abstract關(guān)鍵字允許人們?cè)陬愔袆?chuàng)建一個(gè)或者多個(gè)沒有定義的方法--提供了接口部分,但是沒有提供相對(duì)應(yīng)的實(shí)現(xiàn),這些實(shí)現(xiàn)是由此類的繼承者創(chuàng)建的。interface這個(gè)關(guān)鍵字產(chǎn)生一個(gè)完全抽象的類,他根本就沒有提供任何具體實(shí)現(xiàn),它允許創(chuàng)建者確定方法名、參數(shù)列表和返回類型,但是沒有任何方法提高。接口只是提供了形式,而未提供任何具體實(shí)現(xiàn)。 一個(gè)接口表示:所有實(shí)現(xiàn)了該特定接口的類看起來都像這樣。因此,任何使用某特定接口的代碼都知道可以調(diào)用該接口的哪些方法,而且僅僅需要這些。因此,接口被用來建立類與類之間的協(xié)議。 但是,interface不僅僅是一個(gè)極度抽象的類,因?yàn)樗试S人們通過創(chuàng)建一個(gè)能夠被向上轉(zhuǎn)型為多種基類的類型,來實(shí)現(xiàn)某種類似多重繼承的特性。 接口也可以包含域,但是這些域隱式是static和final的。 可以在接口中顯式的將方法聲明為public的,但即使你不這么做,他們也是public的。 抽象類和抽象方法建立一個(gè)通用接口的唯一理由是,不同的子類可以用不同的方式表示此接口。通用接口建立起一種基本形式,以此表示所有導(dǎo)出類的共同部分。另一種說法是將這種類稱為抽象基類,或簡(jiǎn)稱抽象類。 如果我們只有一個(gè)像Instrument這樣的抽象類,那么該類的對(duì)象幾乎沒有任何意義。我們創(chuàng)建抽象類是希望通過這個(gè)通用接口操縱一系列類。因此,Instrument只是表示了一個(gè)接口,沒有具體的實(shí)現(xiàn)內(nèi)容;因此,創(chuàng)建一個(gè)Instrument對(duì)象沒有什么意義,并且我們可能還想阻止使用者這樣做。通過讓Instrument中的所有方都產(chǎn)生錯(cuò)誤,就可以實(shí)現(xiàn)這個(gè)目的。但是這樣做會(huì)將錯(cuò)誤信息延遲到運(yùn)行時(shí)才獲得,并且需要在客戶端進(jìn)行可靠、詳盡的測(cè)試。所以最好是在編譯時(shí)捕獲這些問題。 為此,java提供一個(gè)叫做抽象方法的機(jī)制,這種方法是不完整的;僅有聲明而沒有方法提。下面是抽象方法聲明所采用的語(yǔ)法: abstrac tvoid f();1復(fù)制代碼類型:[java] 包含抽象的類叫做抽象類。如果一個(gè)類包含一個(gè)或者多個(gè)抽象方法,該類必須被限定為抽象的。 如果一個(gè)抽象類不完整,那么當(dāng)我們?cè)噲D產(chǎn)生該類的對(duì)象時(shí),編譯器會(huì)怎樣處理呢?由于為抽象類創(chuàng)建對(duì)象是不安全的,所以我們會(huì)從編譯器那里得到一條出錯(cuò)消息。 如果從一個(gè)抽象類繼承,并想創(chuàng)建該新類的對(duì)象,那么就必須為基類中所有抽象方法提供方法定義。如果不這么做,那么導(dǎo)出類也必須是抽象類,且編譯器將會(huì)強(qiáng)制我們用abstract關(guān)鍵字來限定這個(gè)類。 我們也可能會(huì)創(chuàng)建一個(gè)沒有任何抽象方法的抽象類??紤]這種情況:如果有一個(gè)類,讓其包含任何abstract方法都顯得沒有實(shí)際意義,而且我們也想要阻止產(chǎn)生這個(gè)類的任何對(duì)象,那么這時(shí)這樣做就很有用了。 創(chuàng)建抽象類和抽象方法非常有用,因?yàn)樗梢允诡惖某橄笮悦鞔_起來,并告訴用戶和編譯器打算怎樣來使用他們。抽象類還是很有用的重構(gòu)工具,因?yàn)樗麄兪沟梦覀兛梢院苋菀椎膶⒐卜椒ㄑ刂^承層次結(jié)構(gòu)向上移動(dòng)。 通過繼承來擴(kuò)展接口通過繼承,可以很容易的在接口中添加新的方法聲明,還可以通過繼承在新接口中組合數(shù)個(gè)接口。這兩種情況都可以獲得新的接口。 interface Monster { void menace(); }interface DangerousMonster extends Monster { void destory(); }123456復(fù)制代碼類型:[java] Java中的多重繼承使用接口的核心原因:為了能夠向上轉(zhuǎn)型為多個(gè)基類型,以及由此帶來的靈活性。 第二個(gè)原因則是和抽象基類相同:防止客戶端程序創(chuàng)建該類的對(duì)象,并確保這僅僅只建立了一個(gè)接口。 怎么判斷使用接口還是抽象類?如果要?jiǎng)?chuàng)建不帶任何方法定義和成員變量的基類,那就應(yīng)該使用接口。事實(shí)上,如果知道某一個(gè)事物應(yīng)該成為一個(gè)基類,那么第一選擇應(yīng)是使他成為一個(gè)接口。 適配接口接口最吸引人的原因之一就是允許同一個(gè)接口具有多個(gè)不同的具體實(shí)現(xiàn)。在簡(jiǎn)單的情況中,他的體現(xiàn)形式通常是接受一個(gè)接口類型的方法,而該接口的實(shí)現(xiàn)和向該方法傳遞的對(duì)象則取決于方法的使用者。 因此,接口的一種常用方法就是策略模式,此時(shí)你編寫一個(gè)執(zhí)行某些操作的方法,而該方法將接受一個(gè)同樣是你指定的接口。你主要就是要聲明:你可以用你想要的任何對(duì)象來調(diào)用我的方法,只要你的對(duì)象遵循我的接口。 接口中的域因?yàn)槟惴湃虢涌谥械娜魏斡蚨甲詣?dòng)是static和final的,所以接口就成為了一種很便捷的用來創(chuàng)建常量組的工具。但在JavaSE5之后,你就可以使用更加強(qiáng)大而靈活的enum關(guān)鍵字。 嵌套接口接口可以嵌套在類或者其他接口中。 class A { interface B { void f(); } public class BImp implements B} |
|