本講要說明的幾個問題:什麼是抽象類別,抽象類別的特點,抽象方法,抽象方法與抽象類別的關係。
1、什麼是抽象類別
抽象類別,實際上就是對類的進一步抽象。
從前面的介紹中,我們知道在物件導向的分析和設計中有很多次抽象,從現實世界中的對象抽象出軟體系統中的對象(保留主要屬性和行為,去掉次要屬性和行為),從軟體系統中的對象抽象出軟體系統中的類(去掉屬性值,把具體的對象變成了抽象的概念),現在我們要介紹的抽象類別是對多個類的抽象結果,抽象類別中描述了多個具體類的共同特徵和行為,與我們之前說的父類是類似,不同之處在於抽象類別不能有具體的對象,抽象類別可以有不用實現的方法。
典型的例子就是交通工具,我們知道飛機、輪船、汽車、火車都是交通工具,都可以把乘客從一個地方帶到另外一個地方,但是各種不同的交通工具的運行方式是不同的,汽車沿著公路走,火車沿著鐵路線走,飛機需要先起飛、飛行、然後降落,有一定的航線。正式因為有這些共同特徵,才抽象出交通工具這樣的類。
我們可以說具體的飛機、輪船、汽車和火車對象,但是沒有交通工具對象,這時候交通工具就是抽象的。
2、如何定義抽象類別
使用abstract關鍵字定義抽象類別,例如:
public abstract class A{
...
}
如果某個類是抽象類別,則這個類不能有具體的對象。
如果某個類沒有具體的對象,這個類還有什麼用呢?通過這個類可以派生出子類,子類可以是抽象類別也可以是非抽象類別。所以有抽象類別通常都是作為父類存在的。
3、抽象方法
在前面的介紹中,我們知道方法包括如下組成部分:方法的修飾符、方法的傳回值類型、方法的名字、方法的參數列表、方法體。例如:
public int getParentA(){
return super.a;
}
如果一個方法只給出方法的定義部分,而沒有方法的具體實現,這個方法就是抽象方法。
例如:
public int getParentA();
抽象方法的含義:某個對象具有這樣的方法,但是方法如何?不清楚。
例如上面的例子,各種交通工具都可以把乘客從一個地方帶到另外一個地方,所以交通工具應該具有一個方法——移動,但是具體如何移動,不清楚,所以如果要在交通工具這個類中定義這個方法,只能是抽象的。意味著,交通工具應該有一個方法(移動),但是具體如何?,需要看具體的子類。
另外一個典型的例子是幾何圖形,在軟體系統中需要畫各種圖形,每種圖形是具體的類,而圖形作為抽象類別。要在系統中顯示各種圖形,每種圖形類都應該有畫的方法,但是各種圖形的畫法不同,例如三角形需要給出3個點,而圓需要給出圓心和半徑,直線需要給出兩個點。所以在圖形抽象類別中中只能聲明這個一個畫的方法,具體實現留給子類。
4、如何定義抽象方法
抽象方法使用關鍵字abstract定義,例如畫圖的方法可以定義為:
public abstract void print();
在類中,如果一個方法只給出聲明,沒有具體實現,應該使用abstract定義為抽象方法。
5、抽象方法與抽象類別
如果一個類中出現了抽象方法,則這個類必須定義為抽象類別。例如上面的圖形類:
public abstract class Graphics{
...
public abstract void print();
}
子類可以去實現具體的畫法,例如三角形:
public class Triangle extends Graphics{
private Point[] p; // 描述三角形的三個點
public abstract void print(){
... // 根據3個點畫圖
}
}
請記住:有抽象方法的類一定是抽象類別。
抽象類別一定要有抽象方法嗎?不一定,抽象類別可以沒有抽象方法。
抽象類別一定不能有執行個體,下面的代碼是錯誤的:
Graphics g = new Graphics();
6、抽象類別的作用
抽象類別用於派生新的子類,子類在繼承抽象類別的時候,必須實現所有抽象方法,除非子類還是抽象類別。
抽象類別的子類允許是抽象類別。
下次介紹物件導向的一大特性——多態性。
上一次: 第三十七講 成員方法的繼承與覆蓋
下一次:第三十九講 多態
李緒成 CSDN Blog:http://blog.csdn.net/javaeeteacher邀請您為好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5