1
繼承與多型
學習目標
• 瞭解繼承目的
• 瞭解繼承與多型的關係
• 知道如何重新定義方法
• 認識java.lang.Object
• 簡介垃圾收集機制
2
繼承共同行為與實作
3
• 重複在程式設計上,就是不好的訊號
4
5
多型與is-a
• 子類別只能繼承一個父類別
• 有is-a的關係,中文稱為「是一種」的關係
– SwordsMan是一種Role(SwordsMan is a
Role)
– Magician是一種Role(Magician is a Role)
6
• 可以通過編譯:
• 也可以通過編譯嗎?
• 為何無法通過編譯呢?
7
• 從=號右邊往左讀
– 右邊是不是一種左邊呢(右邊型態是不是左邊型
態的子類別)?
8
• 以下編譯失敗:
• 如果不想要編譯器囉嗦
9
• 明確要求編譯器別囉嗦了,編譯器就讓這段
程式碼通過編譯了,不過後果得自行負責!
10
• 編譯可以成功,但執行時期會出錯:
11
• 以下編譯成功,執行也沒問題:
• 以下程式片段會編譯失敗:
12
• 以下程式片段編譯成功,執行時也沒問題:
• 以下程式片段編譯成功,但執行時拋出
ClassCastException:
13
• 設計static方法,顯示所有角色的血量!
14
15
• 多型?使用單一介面操作多種型態的物件!
重新定義實作
• 請設計static方法,可以播放角色攻擊動畫
16
• 將fight()方法提昇至Role類別中定義:
• 重新定義(Override)
17
18
19
20
• 如果疏忽打錯字了:
21
抽象方法、抽象類別
• Role的fight()方法沒有撰寫程式碼
22
• 子類別若繼承抽象類別:
– 繼續標示該方法為abstract
– 實作抽象方法
23
protected成員
24
25
26
27
• Role類別原本就定義了toString()方法:
28
29
• 對於父類別的方法權限,只能擴大不能縮小
30
• 預設會呼叫父類別中無參數建構式
31
• 想執行父類別中某建構式,可使用super()
32
33
34
• 編譯器會在沒有撰寫任何建構式時,自動加
入無參數預設建構式(Default constructor)
• 如果自行定義了建構式,就不會自動加入任
何建構式了。
35
final關鍵字
• 在指定變數值之後,若不想改變值,可以在
宣告變數時加上final限定
• 若物件資料成員被宣告為final,沒有明確
使用=指定值,就表示延遲物件成員值的指定
• 若class使用了final關鍵字限定,就表示
這個類別在繼承體系中是最後一個,不會再
有子類別,也就是不能被繼承
36
37
• 定義方法時可以限定為final,表示子類別
不可以重新定義final方法
38
java.lang.Object
• 子類別只能繼承一個父類別
39
• 物件一定「是一種」Object
40
41
42
43
44
重新定義toString()
• Object的toString()預設定義為:
• System.out.print()等方法,就會呼叫
toString()
45
重新定義equals()
• Object類別就有定義的方法:
46
47
• instanceof檢查左運算元型態是否在右運算
元型態的繼承架構
• 實作equals()時通常也會實作hashCode()
48
關於垃圾收集
49
50
51
52
再看抽象類別
• 開發一個猜數字遊戲
53
• 老闆皺著眉頭說:「我有說要在文字模式下
執行遊戲嗎?」
54
55

CH06:繼承與多型