我要規(guī)范代碼,直接寫(xiě)接口然后用一個(gè)類實(shí)現(xiàn)這個(gè)接口不就好了,抽象類在實(shí)際的開(kāi)發(fā)中到底有沒(méi)有什么獨(dú)特的作用?
例子我就不舉了,直接說(shuō)抽象類的作用在哪里。
一、抽象類與一般類的區(qū)別在于抽象方法。它的理念是對(duì)某個(gè)操作下一個(gè)定義,但交給子類去實(shí)現(xiàn)。
你可能會(huì)說(shuō),一般類也可以定義一個(gè)空方法,然后交給子類實(shí)現(xiàn)啊,但這么做因?yàn)闆](méi)有在語(yǔ)法上強(qiáng)迫子類一定要實(shí)現(xiàn)這個(gè)方法,所以如果子類忘了去實(shí)現(xiàn)的話,軟件出錯(cuò)的幾率會(huì)很高。
二、抽象類與接口的區(qū)別在于,它可以包含成員。
當(dāng)然,古時(shí)候 Java 接口不支持缺省方法,但有了缺省方法的接口,仍然不能代替抽象類,因?yàn)闆](méi)有成員。
接口之所以不能有成員,是因?yàn)樗皇菍?duì)象行為的抽象。當(dāng)你需要定義一個(gè)類型,既包含行為抽象,又包含成員來(lái)供子類使用時(shí),顯然只有抽象類可以滿足了。
如果你看JDK的源碼,就會(huì)發(fā)現(xiàn),大部分情況下,你用到的方法,他的父類都是一個(gè)抽象類,而不是一個(gè)直接的接口。原因主要有兩個(gè),接口確實(shí)是用來(lái)定義規(guī)范的,同一個(gè)接口下,可能有大量不同的實(shí)現(xiàn),舉個(gè)例子,List這個(gè)接口
boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection<? extends E> c);
......
但是你去看ArrayList,第一個(gè)繼承的是AbstractList(抽象類),然后你去看LinkedList,第一個(gè)繼承是AbstractSequentialList(抽象類),而AbstractSequentialList也是繼承自AbstractList,你肯定知道ArrayList和LinkedList的區(qū)別咯。為什么這么做呢,因?yàn)橛泻芏喾椒ㄊ强梢詮?fù)用的,比如
public int indexOf(Object o);
public int lastIndexOf(Object o);
......
如果你純粹用接口的話,你需要寫(xiě)很多重復(fù)的代碼,一旦修改,你就麻煩了。抽象類的目的在于,你可以更細(xì)致化的表明哪些是不同的,哪些是相同的。所以這就是接口和抽象類的簡(jiǎn)單區(qū)別。如果還不理解,你可以看看collection容器類的源碼,就會(huì)發(fā)現(xiàn)了。
將部分共有代碼在抽象類中實(shí)現(xiàn)。這里舉一個(gè)在HEAD FIRST DESIGN PATTERNS中的一個(gè)例子。
假設(shè)現(xiàn)在有各種各樣的鴨子,比如橡皮鴨,野鴨。這些鴨子有的能飛有的不能飛,但是它們都有兩個(gè)翅膀,都能發(fā)出聲音。根據(jù)需求我們會(huì)得出以下實(shí)現(xiàn)。
public abstract class Duck{
private Wing leftWing;
private Wing rightWing;
public void quack(){
...
//quack quack
}
}
public interface Flyable{
void fly();
}
public class RubberDuck extends Duck implements Flyable{
public void fly(){
...
//cannot fly
}
}
public class NormalDuck extends Duck implements Flyable{
public void fly(){
...
//fly gracefully
}
}
其實(shí)抽象類本質(zhì)是為了提高代碼的復(fù)用性。在JAVA中的應(yīng)用還是很廣泛的。比如說(shuō)Collection接口之下的AbstractCollection抽象類。
當(dāng)你想要對(duì)某個(gè)接口進(jìn)行默認(rèn)實(shí)現(xiàn),并且不希望在該實(shí)現(xiàn)上創(chuàng)建實(shí)例,那么抽象類是一個(gè)很好的選擇。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。