SlideShare a Scribd company logo
1 of 62
Download to read offline
1
介面與多型
學習目標
• 使用介面定義行為
• 瞭解介面的多型操作
• 利用介面列舉常數
• 利用enum列舉常數
2
使用介面定義行為
• 海洋樂園,全部東西都會游泳
3
4
• 為什麼都是魚?人也會游泳啊!
5
• Human類別繼承Fish...等一下!Human繼承
Fish?
6
• 只能繼承一個父類別,更強化了「是一種」
關係的限制性
• 老闆突發奇想,想把海洋樂園變為海空樂園
• FlyingFish同時繼承Fish跟Bird嗎?
7
• 「全部東西」都會「游泳」,而不是「某種
東西」都會「游泳」
• 先前的設計方式只解決了「全部魚」都會「
游泳」,只要它是一種魚
8
• 「全部東西」都會「游泳」,代表「游泳」
這個「行為」可以被全部東西「擁有」,而
不是「某種」東西專屬
9
10
11
12
13
• 繼承會有「是一種」關係
• 實作介面則表示「擁有行為」然而不會有「
是一種」的關係
14
行為的多型
• 可以通過編譯
15
• 是否可通過編譯?
• 加上扮演(Cast)語法:
16
• 第二行編譯失敗:
• 加上扮演語法:
17
• 拋出ClassCastException錯誤:
• 底下的例子也會出錯:
18
• Java SE 10以後支援var
19
• 寫個static的doSwim()方法,讓會游的東
西都游起來?
20
• 如果「種類」很多怎麼辦?
21
解決需求變化
• 什麼叫有彈性?何謂可維護?
• 如果今天老闆突發奇想,想把海洋樂園變為
海空樂園
• 有的東西會游泳,有的東西會飛,有的東西
會游也會飛
22
• 類別可以實作兩個以上的類別,也就是擁有
兩種以上的行為
23
• 類別可以同時繼承某類別,並實作某些介面
24
• 要讓會游的東西游泳
25
26
• 後續需求超過了既有架構預留之彈性
• 老闆又開口了:不是全部的人類都會游泳吧
!有的飛機只會飛,不能停在海上啊!
27
• 不再讓Human實作Swimmer:
28
• 游泳選手是一種人,並擁有Swimmer的行為
29
• 有的飛機只會飛
30
• Seaplane會在海上航行
31
• 程式中的直昇機就只會飛
32
• 大規模的程式中調整程式架構會有多麼麻煩
• 不好的架構下要修改程式,很容易牽一髮而
動全身
33
• 老闆又想到了:水裡的話,將淺海游泳與深
海潛行分開好了!
• 介面可以繼承自另一個介面
34
35
• 一般的船可以在淺海航行:
• 潛水航是一種船,可以在淺海游泳,也可以
在深海潛行
36
37
• 需求不斷變化,架構也有可能因此而修改
• 好的架構在修改時,其實也不會全部的程式
碼都被牽動
• 他說一個你改一個,也不是辦法
• 找個時間,好好跟老闆談談這個程式的需求
邊界到底在哪吧!
38
介面語法細節
• 方法可宣告為public abstract
• 可以省略public abstract:
39
• 編譯器會自動加上public abstract
40
• 從JDK8開始,interface的方法可以有限
地實作
• 可以定義常數
41
42
43
• 只能定義public static final列舉常數
44
• 有兩個介面都定義了某方法
45
• 程式面來說,不會有錯誤,照樣通過編譯:
46
• Some與Other定義的execute()是否表示
不同的行為?
• 如果表示不同的行為,那麼Service在實作
時,應該有不同的方法實作
• 那麼Some與Other的execute()方法,就
得在名稱上有所不同,Service在實作時才
可以有兩個不同的方法實作
47
• 如果表示相同的行為,那可以定義一個父介
面,在當中定義execute()方法
48
49
匿名內部類別
50
• Java SE 10支援var自動推斷區域變數型態
51
• Some介面定義了doService()方法
52
• 假設你打算開發多人連線程式,對每個連線
客戶端,都會建立Client物件封裝相關資訊
53
• 可以將Client加入或移除的資訊封裝為
ClientEvent:
54
• 如果有物件對Client加入ClientQueue有
興趣,可以實作這個介面:
• 如何在ClientQueue新增或移除Client時
予以通知呢?
55
56
57
58
• 在JDK8出現前
59
使用enum列舉常數
60
61
62

More Related Content

More from Justin Lin

More from Justin Lin (20)

Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
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起步走
 

CH07:介面與多型