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