我們在上一章中介紹了什麼是介面,也說到了介面就是一組抽象的資料模型,可以理解為一組協議。但實際上,在物件導向的概念中,有乙個知識點是極容易被人與介面混淆的,人們往往會誤解為這兩者是同乙個概念。但不幸的是,兩者雖然有相似之處,但卻是完全不一樣的概念。那麼,如此神秘的它到底是什麼呢?讓我們揭開它的蓋頭來—主角登場–>抽象類。
什麼叫抽象類呢?從語義而言,抽象類的意思是指類的抽象體。什麼意思呢?我們知道類是對具體事物的抽象,但是有的時候,有一些類的資訊不足以去描繪出乙個具體的物件,那麼這些類就叫做抽象類。什麼意思呢?就好比現在有三角形類,四邊形類,八邊形類。它們的形狀都是不一樣的。但是它們又都可以叫做圖形,只是每個類的畫法是不一樣的而已。那麼,在這裡,我們就可以構建乙個叫做圖形的抽象類,然後在裡面新增乙個叫做畫圖的抽象方法,然後讓三角形類,四邊形類,八邊形類去繼承這個抽象類,再重寫這個畫圖方法。比如:
package testabstractclass;
/** * 測試入口
*/public class
test1
}/**
* 繼承了抽象類的三角形類
*/class
********
extends
absgraph
@override
public void draw()
}/**
* 繼承了抽象類的四邊形類
*/class
quadrilateral
extends
absgraph
@override
public void draw()
}/**
* 抽象類
*/abstract
class
absgraph
執行後,效果如下:
注意的是:一但在抽象類中宣告了抽象方法,那麼就必須要在子類中實現該方法,這點和介面是相似的。但和介面不同的是,抽象類中是可以存在具體的實現方法,並且該方法是可以不被子類實現而直接呼叫的。比如:
package testabstractclass;
/** * 測試入口
*/public
class
test1
}class ******** extends absgraph
@override
public
void
draw()
}abstract class absgraph
}
執行結果如下:
從以上兩點可以得出,其實抽象類和普通的類在語法上是很相似的,只是在標誌符上用了abstracrt關鍵字來標明類。例項如下:
abstract class absclass
}
那麼,抽象類和普通類有什麼不一樣的地方呢?主要有三點:
1.抽象類不能直接初始化物件,必須建立乙個子類去繼承,並且實現抽象類中的所有抽象方法
2.抽象類不能用private關鍵字標識類體或抽象方法
3.抽象類允許包含抽象成員(但沒有強制要求)
注意:針對第一點,有乙個地方容易讓人混淆,事例如下:
有人可能會疑慮:不是說抽象類不能直接初始化物件嗎?怎麼在這個例子裡面又可以呢?其實,這個問題在講到內部類的時候,就已經說到了。在這個例子裡,抽象類並沒有直接初始化乙個物件,而是通過乙個匿名內部類繼承了absgraph,實現了抽象方法之後,再將其向上轉型為
absgraph型別的********物件。其中涉及了多型及內部類的相關知識點。同時,因為介面也可以作為匿名內部類的繼承方式,所以這裡也容易被人與介面進行混淆。
那麼,既然我們說抽象類容易被人與介面進行混淆,那麼他們之間有什麼區別呢?我們來看看:
1.從繼承方式來看,乙個子類只可以繼承乙個父類(不管是具體類還是抽象類),但可以繼承多個介面
2.抽象類可以實現方法的細節,但是介面是不允許存在的。這表現為:如果有兩個子類繼承了抽象類。那麼當有需求進行更改的時候,我們只需要更改抽象類而不同更改它的子類。這等於一種模板式的設計。我們確定好了模板之後,所生產的產品是不需要再做改動的。但是如果兩個自己實現了介面,當介面發生了改變時,那麼它的子類是需要發生相應的改變的。這是一種輻射性設計,當協議發生改變的時候,其子類必須修改自身去適應這個協議的要求。因此,我們也說抽象類就是模板,而介面就是協議。
3.介面中不能含有靜態的方法,而抽象類中允許
4.介面預設所有的方法為public abstract final型別,而介面的方法可以自定義。
java物件導向(抽象類)
抽象類 當多個類中出現相同功能,但是功能主體不同。這是可以進行向上抽取,這時,只抽取功能定義,而不抽取功能主體。抽象 就是模糊的意思.抽象類的特點 1,抽象方法一定在抽象類中。2,抽象方法和抽象類都必須被abstract關鍵字修飾。3,抽象類不可以用new建立物件,因為呼叫抽象方法沒意義。4,抽象類...
java物件導向 十五 抽象類
乙個類不可能去繼承乙個已經實現好的類,只能繼承抽象類或實現介面.普通類就是乙個完善的功能類,可以直接產生物件並且可以直接使用,裡面的方法都是帶有方法體 的,而抽象類中最大的特點是包含了抽象方法,抽象方法是只宣告而未實現 沒有方法體 抽象方法定義時要使用abstract關鍵字,並且抽象方法一定要在抽象...
物件導向 抽象類
抽象 裡邊有未明確的東西。抽象類的特點 1 抽象方法一定在抽象類中。2 抽象方法和抽象類都必須被abstract關鍵字修飾。3 抽象類不可以用new建立物件,因為呼叫抽象方法沒意義。4 抽象類中的抽象方法要被使用,必須由子類複寫其所有的抽象方法後,建立子類物件呼叫。如果子類只覆蓋部分抽象方法,那麼該...