SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
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

Mais conteúdo relacionado

Mais de Justin Lin

Mais de Justin Lin (20)

Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
5. 從模組到類別
5. 從模組到類別5. 從模組到類別
5. 從模組到類別
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 
3.型態與運算子
3.型態與運算子3.型態與運算子
3.型態與運算子
 
1. Python起步走
1. Python起步走1. Python起步走
1. Python起步走
 
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
 

CH06:繼承與多型