<a href="http://blog.csdn.net/ooppookid/article/category/6134850">點選進入_更多_java千百問</a>
抽象,和具體對立,定義了事物的性質,事物的性質會随着抽象概念的改變而改變。
抽象類和普通類一樣,是一個模版。相比普通類,抽象類不具備執行個體化對象的能力。抽象類也可以定義屬性和方法,比之普通類,它還可以定義沒有實作的方法,即抽象方法。
通常會用一個具體類(子類)繼承抽象類(父類),實作抽象類中的抽象方法。父類包含子類的集合的通用功能,但父類本身過于抽象而無法被單獨使用。
例如:将脊椎動物定義為一個抽象類,它具有頭、軀幹、尾等屬性,具有吃、繁殖等具體行為,還有一個抽象行為:吠叫,吠叫這個行為并不具體,因為不同種類的脊椎動物吠叫行為并不相同。狗類繼承脊椎動物類,實作狗的吠叫行為。
java中使用abstract關鍵字來聲明一個類的抽象。abstract需要寫在class關鍵字前面。
執行個體:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
請注意,這個employee類與具體類沒有什麼不同。現在這個類是抽象的,但它仍然有三個字段,七種方法,和一個構造函數。
但現在如果想執行個體化這個類,如下:
編譯後,會得到以下錯誤:
employee.java:46: employee is abstract; cannot be instantiated
employee e = new employee(“george w.”, “houston, tx”, 43);
^
1 error
我們可以繼承employee類,如下所示:
這裡,我們可以執行個體化一個salary對象,這個對象将繼承employee類的三個字段,七種方法。
運作後産生以下結果:
constructing an employee
call mailcheck using salary reference –
within mailcheck of salary class
mailing check to mohd mohtashim with salary 3600.0
call mailcheck using employee reference–
mailing check to john adams with salary 2400.
如果你想在抽象類中定義一個方法,但是希望該方法由子類來決定實際的執行情況,可以在父類中定義抽象方法。
聲明一個抽象方法也需要abstract關鍵字。抽象方法隻是一個方法簽名,沒有方法實作,故不需要使用花括号。
如下所示:
聲明一個抽象方法有兩個規則:
這個類也必須是抽象類。
所有子類要麼重寫抽象方法,要麼聲明本身也為抽象。
如果salary類是employee類的子類,那麼它必須實作computepay() 方法,如下: