接口與內(nèi)部類為我們提供了一種接口與實(shí)現(xiàn)分離的更加結(jié)構(gòu)化的方法踱卵。
1.抽象類與抽象方法
抽象類嘉裤,作為普通的類和接口之間的一種中庸之道郑临。
抽象方法:僅有聲明而沒有方法體,如abstract void play();抽象方法必須用abstract修飾屑宠,且必須為public或者protected厢洞。
抽象類:包含抽象方法的類。若一個(gè)類包含一個(gè)或者多個(gè)抽象方法典奉,該類必須限定為abstract(抽象的)躺翻。抽象類不能實(shí)例化,且子類若沒有實(shí)現(xiàn)父類的抽象方法卫玖,也必須限定為abstract公你。
創(chuàng)建抽象類和抽象方法非常有用,可以使類的抽象性明確起來
2.接口
interface關(guān)鍵字產(chǎn)生一個(gè)完全抽象的類假瞬,不提供任何具體實(shí)現(xiàn)陕靠。
接口允許創(chuàng)建者確定方法名迂尝、參數(shù)列表、和返回類型剪芥,但是沒有任何的方法實(shí)體垄开。因此,接口常被用來建立類與類之間的協(xié)議税肪。
接口允許多重繼承溉躲,因此繼承多個(gè)接口的類可以向上轉(zhuǎn)型為多種基類的類型。
接口中的域隱式的為static益兄、final锻梳。接口中定義的域不能是“空final”,但是可以是非常量表達(dá)式初始化(如可以使用random初始化)偏塞。
要實(shí)現(xiàn)一個(gè)接口唱蒸,需要使用implements關(guān)鍵字邦鲫。
接口要么加public灸叼,要么默認(rèn)只有包訪問權(quán)限;接口中的方法默認(rèn)為public庆捺。
3.完全解耦
策略設(shè)計(jì)模式模式:創(chuàng)建一個(gè)能夠根據(jù)所傳遞的參數(shù)的對(duì)象的不同而具有不同行為的方法古今。
適配器模式:作為兩個(gè)不兼容接口之間的橋梁。
工廠設(shè)計(jì)模式:創(chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯滔以,并且是通過使用一個(gè)共同的接口來指向新創(chuàng)建的對(duì)象
參考設(shè)計(jì)模式總結(jié)
4.java的多重繼承
導(dǎo)出類不強(qiáng)制要求必須有一個(gè)是抽象的或者具體的(無抽象方法)“基類”捉腥,但是最多只能有一個(gè)“基類”,其余必須都是接口你画。
可以繼承任意多個(gè)接口(implements關(guān)鍵字后抵碟,用逗號(hào)隔開),并且可以向上轉(zhuǎn)型為每個(gè)接口(由此可以帶來很多靈活性)坏匪。
5.通過繼承擴(kuò)展接口
通過繼承拟逮,可以在接口中添加新的方法,以及組合數(shù)個(gè)接口适滓。
interface Monster {
void menace();
}
interface DangerousMonster extends Monster {
void destroy();
}
interface Lethal {
void kill();
}
interface Vampire extends DangerousMonster, Lethal {
void drinkBlood();
}
6.接口與抽象類的區(qū)別
1.語法層面上的區(qū)別
- 抽象類可以提供成員方法的實(shí)現(xiàn)細(xì)節(jié)敦迄,而接口中只能存在public abstract 方法;
- 抽象類中的成員變量可以是各種類型的凭迹,而接口中的成員變量只能是public static final類型的罚屋;
- 抽象類除了不能實(shí)例化外,與普通類沒有區(qū)別嗅绸;而接口是完全不同的類型脾猛;
- 一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口鱼鸠;
- 抽象類可以有構(gòu)造器猛拴,但是接口不能有構(gòu)造器喉刘;
- 往抽象類中添加新的方法,不需要改變你現(xiàn)在的代碼漆弄。但往接口中添加方法睦裳,那么你必須改變實(shí)現(xiàn)該接口的類
2.設(shè)計(jì)層面上的區(qū)別
- 抽象類是對(duì)一種事物的抽象,即對(duì)類抽象撼唾,而接口是對(duì)行為的抽象廉邑。抽象類是對(duì)整個(gè)類整體進(jìn)行抽象,包括屬性倒谷、行為蛛蒙,但是接口卻是對(duì)類局部(行為)進(jìn)行抽象。繼承是一個(gè) "是不是"的關(guān)系渤愁,而接口實(shí)現(xiàn)則是 "有沒有"的關(guān)系牵祟;
- 設(shè)計(jì)層面不同,抽象類作為很多子類的父類抖格,它是一種模板式設(shè)計(jì)诺苹。而接口是一種行為規(guī)范,它是一種輻射式設(shè)計(jì)雹拄。
7.參考文獻(xiàn):
《java編程思想》
深入理解Java的接口和抽象類