一:抽象類編程
1 :抽象方法:只有方法聲明,沒有方法主體 abstract void fun();spa
2: 一個類裏面有抽象方法,此類就是抽象類,用abstract修飾,.net
由於抽象類中含有無具體實現的方法,因此不能用抽象類建立對象設計
//下面要注意一個問題:在《JAVA編程思想》一書中,將抽象類定義爲「包含抽象方法的類」,可是後面發現若是一個類不包含抽象方法,只是用abstract修飾的話也是抽象類。也就是說抽象類不必定必須含有抽象方法。我的以爲這個屬於鑽牛角尖的問題吧,由於若是一個抽象類不包含任何抽象方法,爲什麼還要設計爲抽象類?因此暫且記住這個概念吧,沒必要去深究爲何。code
3 抽象類就是用來繼承的,由於若是你定義了一個抽象類不繼承它,就白白建立對象
在父類中,若是他的某個方法在父類裏面實現沒有任意義,就在他的子類裏面根據子類的需求進行不一樣的實現,將這個方法定義爲abstract,那麼類也是abstract的blog
4 抽象類也能夠有成員變量和普通方法,和普通類區別a 抽象類缺省默認public(也能夠protect,不能private)b 抽象類不能參加對象 c 子類必須實現抽象類的全部抽象方法,不然子類也仍是abstract繼承
二 : 接口接口
初期理解:1:特殊的抽象類,不能夠建立對象,須要子類實現,子類對接口中的方法所有覆蓋後,子類才能夠實例化模板
實際:在代碼裏面自定義接口,方便給別人看(具體怎麼實現沒人關心),或者修改代碼方便
1接口interface 接口中的變量會被隱式的指定爲public static final
接口中的方法會被隱式指定爲public abstract
2 接口能夠多實現 class ClassName implements Interface1, Interface2, [...] {}
3 遵循了接口的類必須實現接口的因此方法(遵循了接口的抽象類能夠不實現接口方法)
借鑑// 三 抽象類和接口的區別
1 從語法上面 a 抽象類能夠提供成員方法的實現細節,接口只能提供public abstract 方法
b 抽象類變量能夠多種類型,接口變量只能是public static final 類型的
c 一個類只能繼承一個抽象類,但能夠實現多個接口
d 抽象類能夠有static代碼塊和static方法,而接口不行
2 從設計層面區別
抽象類是對事物的抽象,即對類抽象,接口是對行爲的抽象,抽象類是對事物總體進行抽象,即屬性和行爲,接口是對類局部(行爲)抽象,舉個例子,飛機和鳥是不一樣事物,可是他們都有一個特性 飛行, 設計的時候,飛機能夠設計Airplane類,鳥能夠設計Bird類,可是飛行不能Fly類,由於它只是行爲特性。咱們能夠將飛行設計成Fly接口,裏面有fly(),類Airplane實現Fly接口,類Bird實現Fly接口,不一樣種類飛機就繼承Airplane,從這裏看出,繼承是一個「是否是」的關係,接口是「有沒有,具不具有「的關係,好比鳥能飛就實現接口,不能飛就不實現;
借鑑:設計層面不一樣,抽象類做爲不少子類的父類,它是一種模板式設計。而接口是一種行爲規範,它是一種輻射式設計。什麼是模板式設計?最簡單例子,你們都用過ppt裏面的模板,若是用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,若是它們的公共部分須要改動,則只須要改動模板A就能夠了,不須要從新對ppt B和ppt C進行改動。而輻射式設計,好比某個電梯都裝了某種報警器,一旦要更新報警器,就必須所有更新。也就是說對於抽象類,若是須要添加新的方法,能夠直接在抽象類中添加具體的實現,子類能夠不進行變動;而對於接口則不行,若是接口進行了變動,則全部實現這個接口的類都必須進行相應的改動。
下面看一個網上流傳最普遍的例子:門和警報的例子:門都有open( )和close( )兩個動做,此時咱們能夠定義經過抽象類和接口來定義這個抽象概念:
abstract class Door() { public abstract void open(); public abstract void close(); } interface Door() { public abstract void open(); public abstract void close(); }
可是如今若是咱們須要門具備報警alarm( )的功能,那麼該如何實現?下面提供兩種思路:
1)將這三個功能都放在抽象類裏面,可是這樣一來全部繼承於這個抽象類的子類都具有了報警功能,可是有的門並不必定具有報警功能;
2)將這三個功能都放在接口裏面,須要用到報警功能的類就須要實現這個接口中的open( )和close( ),也許這個類根本就不具有open( )和close( )這兩個功能,好比火災報警器。
從這裏能夠看出, Door的open() 、close()和alarm()根本就屬於兩個不一樣範疇內的行爲,open()和close()屬於門自己固有的行爲特性,而alarm()屬於延伸的附加行爲。所以最好的解決辦法是單獨將報警設計爲一個接口,包含alarm()行爲,Door設計爲單獨的一個抽象類,包含open和close兩種行爲。再設計一個報警門繼承Door類和實現Alarm接口。
interface Alarm() { void alarm(); } abstract class Door() { void open(); void close(); } class AlarmDoor extends Door implements Alarm() { void open() {}; void close() {}; void alarm() {}; }
http://blog.csdn.net/e01014165/article/details/51926249