參考
java抽象類和抽象方法
Android開發:抽象類(abstract class)和接口(Interface)的區別
Java基礎篇(一):接口與抽象類
java抽象類和接口的區別,使用場景
如果我們進行一個圖形編輯軟件的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們本質上又都屬于這樣一個概念:形狀,形狀這個概念在問題領域是不存在的,所以形狀就是一個圓形、三角形的抽象類。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能實例化的。
你可以直接使用普通類來實現同樣的邏輯,但是,讓具體的實現方法和類抽象化,你可以清晰的告訴使用者這個類不能直接使用,它應該作為基類,然后讓子類來實現抽象方法。(模板方法設計模式)
抽象類有點類似“模板”的作用,目的是根據其格式來創建和修改新的類。對象不能由 抽象類直接創建,只可以通過抽象類派生出新的子類,再由其子類來創建對象。當一個類被聲明為抽象類時,要在這個類前面加上修飾符abstract。
在抽象類中的成員方法可以包括一般方法和抽象方法。抽象方法就是以abstract修飾的方法,這種方法只聲明返回的數據類型、方法名稱和所需的參數,沒 有方法體,也就是說抽象方法只需要聲明而不需要實現。當一個方法為抽象方法時,意味著這個方法必須被子類的方法所重寫,否則其子類的該方法仍然是 abstract的,而這個子類也必須是抽象的,即聲明為abstract。
abstract class Animal//定義抽象類
{
String str;
Animal(String s)//定義抽象類的一般方法
{
str=s;
}
abstract void eat();//定義抽象方法
}
class Horse extends Animal//定義繼承Animal的子類
{
String str;
Horse(String s)
{
super(s);//調用父類的構造方法
}
void eat()//重寫父類的抽象方法
{
System.out.println("馬吃草料!");
}
}
抽象類方式中,抽象類可以擁有任意范圍的成員數據,同時也可以擁有自己的非抽象方法,但是接口方式中,它僅能夠有靜態、不能修改的成員數據(即final static,但是我們一般是不會在接口中使用成員數據),同時它所有的方法都必須是抽象的。在某種程度上來說,接口是抽象類的特殊化。
從設計的層面來看,我覺得抽象類與接口有如下幾個不同點:
- 抽象層次不同。可以這樣理解,抽象類是對類的抽象,接口是對行為的抽象。抽象類對是類整體進行抽象,包括屬性、行為,而接口是對類局部(行為)進行抽象。
- 跨域不同。抽象類所跨域的是具有相似特點的類,而接口可以跨域不同的類。抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a" 關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。