SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
Java SE 8 技術手冊第 6 章 - 繼承與多型
Report
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Aug. 13, 2014
•
0 likes
•
3,489 views
1
of
78
Java SE 8 技術手冊第 6 章 - 繼承與多型
Aug. 13, 2014
•
0 likes
•
3,489 views
Download Now
Download to read offline
Report
Technology
瞭解繼承目的 瞭解繼承與多型的關係 知道如何重新定義方法 認識java.lang.Object 簡介垃圾收集機制
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Recommended
《Python 3.5 技術手冊》第六章草稿
Justin Lin
3.2K views
•
37 slides
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Justin Lin
3.6K views
•
15 slides
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
2.5K views
•
78 slides
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
3.2K views
•
91 slides
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
2.2K views
•
126 slides
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
2.2K views
•
80 slides
More Related Content
What's hot
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
2.1K views
•
66 slides
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Justin Lin
3.5K views
•
52 slides
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
2.8K views
•
84 slides
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
2.2K views
•
48 slides
2, object oriented programming
ted-xu
290 views
•
31 slides
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
2.2K views
•
82 slides
What's hot
(20)
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
•
2.1K views
Java SE 7 技術手冊投影片第 03 章 - 基礎語法
Justin Lin
•
3.5K views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin
•
2.8K views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
2, object oriented programming
ted-xu
•
290 views
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
•
2.2K views
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
•
4.2K views
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
•
2.5K views
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
•
2.6K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
•
2.1K views
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
•
5.3K views
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
•
5.3K views
Java SE 7 技術手冊投影片第 08 章 - 例外處理
Justin Lin
•
2.4K views
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
•
2.3K views
Java SE 7 技術手冊投影片第 13 章 - 視窗程式設計
Justin Lin
•
2.4K views
SCJP ch17
r82093403
•
669 views
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
•
3.6K views
從模組到類別
Justin Lin
•
1.7K views
Viewers also liked
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
11.6K views
•
44 slides
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
2.6K views
•
48 slides
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin
4.9K views
•
81 slides
Java SE 8 技術手冊第 7 章 - 介面與多型
Justin Lin
2.7K views
•
67 slides
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin
3.2K views
•
70 slides
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
2.9K views
•
101 slides
Viewers also liked
(20)
Java SE 8 技術手冊第 1 章 - Java平台概論
Justin Lin
•
11.6K views
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
Java SE 8 技術手冊第 9 章 - Collection與Map
Justin Lin
•
4.9K views
Java SE 8 技術手冊第 7 章 - 介面與多型
Justin Lin
•
2.7K views
Java SE 8 技術手冊第 8 章 - 例外處理
Justin Lin
•
3.2K views
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
•
2.9K views
Java SE 8 技術手冊第 13 章 - 時間與日期
Justin Lin
•
3.4K views
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
•
5.6K views
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
•
3.6K views
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
•
4.4K views
Python 起步走
Justin Lin
•
7.2K views
3D 之邏輯與美感交會 - OpenSCAD
Justin Lin
•
1.4K views
Java SE 7 技術手冊試讀 - Java 平台概論
Justin Lin
•
5.5K views
淺談 Groovy 與 Gradle
Justin Lin
•
8.4K views
從 REPL 到 IDE
Justin Lin
•
2.3K views
Java 8 與 retrolambda
Justin Lin
•
5K views
資料結構
Justin Lin
•
1.8K views
常用內建模組
Justin Lin
•
1.4K views
進階主題
Justin Lin
•
3K views
Spring 2.0 技術手冊再版序
Justin Lin
•
1.5K views
More from Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
859 views
•
22 slides
Ch13 整合 Spring MVC/Security
Justin Lin
279 views
•
58 slides
Ch12 Spring 起步走
Justin Lin
262 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
155 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
152 views
•
30 slides
Ch09 整合資料庫
Justin Lin
229 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Justin Lin
•
859 views
Ch13 整合 Spring MVC/Security
Justin Lin
•
279 views
Ch12 Spring 起步走
Justin Lin
•
262 views
Ch11 簡介 JavaMail
Justin Lin
•
155 views
Ch10 Web 容器安全管理
Justin Lin
•
152 views
Ch09 整合資料庫
Justin Lin
•
229 views
Ch08 自訂標籤
Justin Lin
•
131 views
Ch07 使用 JSTL
Justin Lin
•
155 views
Ch06 使用 JSP
Justin Lin
•
245 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
199 views
Ch04 會話管理
Justin Lin
•
235 views
Ch03 請求與回應
Justin Lin
•
230 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
336 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.1K views
14. 進階主題
Justin Lin
•
400 views
13.並行、平行與非同步
Justin Lin
•
233 views
12. 除錯、測試與效能
Justin Lin
•
148 views
11. 常用內建模組
Justin Lin
•
140 views
10. 資料永續與交換
Justin Lin
•
148 views
9. 資料結構
Justin Lin
•
284 views
Recently uploaded
ncuma_型別與迴圈.pptx
NCU MCL
425 views
•
26 slides
ncuma_函數畫圖_習題2.pptx
NCU MCL
30 views
•
1 slide
ncuma_Taylor 多項式.pptx
NCU MCL
13 views
•
6 slides
ncuma_Taylor 多項式_習題1.pptx
NCU MCL
9 views
•
2 slides
ncuma_牛頓法.pptx
NCU MCL
6 views
•
4 slides
Keysight Recent Press Release for 5G RAN 20220725.pdf
TimmyCheng5
5 views
•
80 slides
Recently uploaded
(20)
ncuma_型別與迴圈.pptx
NCU MCL
•
425 views
ncuma_函數畫圖_習題2.pptx
NCU MCL
•
30 views
ncuma_Taylor 多項式.pptx
NCU MCL
•
13 views
ncuma_Taylor 多項式_習題1.pptx
NCU MCL
•
9 views
ncuma_牛頓法.pptx
NCU MCL
•
6 views
Keysight Recent Press Release for 5G RAN 20220725.pdf
TimmyCheng5
•
5 views
黃俊毓講師_以黑客精神黑客自己的家鄉.pdf
俊毓 黃
•
26 views
ncuma_函數畫圖.pptx
NCU MCL
•
111 views
ncuma_pylab.pptx
NCU MCL
•
31 views
ncuma_函數畫圖_習題3.pptx
NCU MCL
•
107 views
ncuma_字串.pptx
NCU MCL
•
8 views
ncuma_函數微分計算_習題1.pptx
NCU MCL
•
6 views
ncuma_串列.pptx
NCU MCL
•
11 views
ncuma_邏輯與迴圈.pptx
NCU MCL
•
26 views
ncuma_Taylor 多項式_習題2.pptx
NCU MCL
•
7 views
ncuma_SymPy符號運算套件.pptx
NCU MCL
•
23 views
ncuma_函式.pptx
NCU MCL
•
25 views
ncuma_函數微分計算_習題2.pptx
NCU MCL
•
5 views
ncuma_函數畫圖_習題1.pptx
NCU MCL
•
122 views
初探 Data API Builder:在幾分鐘內將資料庫轉換成 REST 和 GraphQL 不再是夢想
Alan Tsai
•
10 views
Java SE 8 技術手冊第 6 章 - 繼承與多型
2.
繼承與多型 學習目標 • 瞭解繼承目的 • 瞭解繼承與多型的關係 •
知道如何重新定義方法 • 認識 java.lang.Object • 簡介 收集機制垃圾
3.
繼承共同行為 • 假設你在正開發一款 RPG
( Role-playing game )遊戲,一開始設定的角色有劍士與魔 法師…
5.
繼承共同行為 • 如果要改進,可以把相同的程式碼提昇 ( Pull
up )為父類別…
7.
繼承共同行為 • 接著 SwordsMan
可以如下繼承 Role :
8.
繼承共同行為 • Magician 也可以如下定義繼承
Role 類別 :
9.
繼承共同行為 • 如何看出確實有繼承了 ?呢
10.
多型與 is-a • 子類別只能繼承一個父類別 •
繼承可避免類別間重複的行為定義 • 子類別與父類別間會有 is-a 的關係 – SwordsMan 是一種 Role ( SwordsMan is a Role ) – Magician 是一種 Role ( Magician is a Role )
11.
多型與 is-a • 要開始理解多型(
Polymorphism ),必須先 知道你操作的物件是「 一種」東西哪 • 可以通過編譯:
12.
多型與 is-a • 以下的程式片段也可以通過編譯? •
以下的程式片段為何無法通過編譯 ?呢
13.
多型與 is-a • 將自己當作編譯器,從
= 號右邊往左讀:右 邊是不是一種左邊 (右邊型態是不是左邊呢 型態的子類別)?
14.
多型與 is-a • 以下編譯失敗: •
以下的程式片段是否可以通過編譯:
15.
多型與 is-a • 如果你不想要編譯器囉
,可以叫它住嘴:嗦 • 執行時期並不會出錯
16.
多型與 is-a • 以下的程式片段編譯可以成功: •
執行時期發生錯誤
17.
多型與 is-a • 以下編譯成功,執行也沒問題: •
以下程式片段會編譯失敗:
18.
多型與 is-a • 以下程式片段編譯成功,執行時也沒問題: •
以下程式片段編譯成功,但執行時 出拋 ClassCastException :
19.
多型與 is-a • 好像只是在玩弄語法? •
設計 static 方法,顯示所有角色的血量 …
20.
多型與 is-a • 重載方法的運用 •
如果有一百個角色 ?重載出一百個方法?呢
21.
多型與 is-a • 這些角色都是一種
Role
22.
多型與 is-a • 什麼叫多型?以抽象講法解釋,就是使用單 一介面操作多種型態的物件! •
若用以上的範例來理解,在 showBlood() 方法中,既可以透過 Role 型態操作 SwordsMan 物件,也可以透過 Role 型態操 作 Magician 物件。
23.
重新定義行為 • 請設計 static
方法,可以播放角色攻擊動 畫 …
24.
重新定義行為 • 對 drawFight()
方法而言,只知道傳進來 的會是一種 Role 物件,所以編譯器也只能 檢查你呼叫的方法, Role 是不是有定義 • 仔細觀察一下 SwordsMan 與 Magician 的 fight() 方法的方法簽署( method signature ) …
25.
重新定義行為 • 將 fight()
方法提昇至 Role 類別中定義:
26.
重新定義行為
27.
重新定義行為 • 如果傳入 fight()
的是 SwordsMan , role 參數參考的就是 SwordsMan 實例,操作的就是 SwordsMan 上的方法定義:
28.
重新定義行為 • 如果傳入 fight()
的是 Magician , role 參數參考的就是 Magician 實例,操作的就 是 Magician 上的方法定義:
29.
重新定義行為 • 在重新定義父類別中某個方法時,子類別必 須撰寫與父類別方法中相同的簽署 • 如果疏忽打錯字了…
30.
重新定義行為 • 在 JDK5
之後支援標註( Annotation ) • @Override 要求編譯器檢查,該方法是不 是真的重新定義了父類別中某個方法
31.
抽象方法、抽象類別 • 上一個範例中 Role
類別的定義 中, fight() 方法區塊中實際上沒有撰寫 任何程式碼 • 沒有任何方式強迫或提示子類別一定要實作 fight() 方法
32.
抽象方法、抽象類別 • 如果某方法區塊中真的沒有任何程式碼實作,可以 使用 abstract
標示該方法為抽象方法( Abstract method ) • 內含抽象方法的類別,一定要在 class 前標示 abstract ,如上例所示,這表示這是一個定義不 完整的抽象類別( Abstract class )
33.
抽象方法、抽象類別 • 如果嘗試用抽象類別建構實例,就會引發編 譯錯誤:
34.
抽象方法、抽象類別 • 子類別如果繼承抽象類別,對於抽象方法有 兩種作法 – 繼續標示該方法為
abstract (該子類別因此也 是個抽象類別,必須在 class 前標示 abstract ) – 實作抽象方法 • 兩個作法都沒實施,就會引發編譯錯誤:
35.
protected 成員 • 上一節的
RPG 遊戲來說,如果建立了一個角 色,想顯示角色的細節,必須如下撰寫:
36.
protected 成員 • 可以在
SwordsMan 或 Magician 上定義個 toString() 方法,傳回角色的字串描述:
37.
protected 成員 • 客戶端就可以如下撰寫: •
不過因為 Role 中的 name 、 level 與 blood 被定義為 private ,所以無法直接 於子類別中存取,只能透過 getName() 、 getLevel() 、 getBlood() 來取得
38.
protected 成員 • 只想讓子類別可以直接存取
name 、 level 與 blood 的話,可以定義它們為 protected :
39.
protected 成員
40.
重新定義的細節 • 有時候重新定義方法時,並非完全不滿意父 類別中的方法,只是希望在執行父類別中方 法的前、後作點加工
41.
重新定義的細節 • 如果想取得父類別中的方法定義,可以於呼 叫方法前,加上 super
關鍵字
42.
重新定義的細節 • 可以使用 super
關鍵字呼叫的父類別方法, 不能定義為 private • 對於父類別中的方法權限,只能擴大但不能 縮小 – 若原來成員 public ,子類別中重新定義時不可 為 private 或 protected
43.
重新定義的細節 • 在 JDK5
之前…
44.
重新定義的細節 • 在 JDK5
之後,重新定義方法時,如果返回 型態是父類別中方法返回型態的子類別,也 是可以通過編譯的,圖 6.11 的例子,在 JDK5 中並不會出現編譯錯誤
45.
再看建構式 • 在建構子類別實例後,會先進行父類別定義 的初始流程,再進行子類別中定義的初始流 程 • 也就是建構子類別實例後,會先執行父類別 建構式定義的流程,再執行子類別建構式定 義的流程
46.
再看建構式 • 如果子類別建構式中沒有指定執行父類別中 個建構式,預設會呼叫父類別中無參數建哪 構式
47.
再看建構式 • 如果想執行父類別中某建構式,可以使用 super() 指定:
48.
再看建構式 • 當你這麼撰寫時:
49.
再看建構式 • 等於你這麼撰寫:
50.
再看建構式 • 知道以下為什麼會編譯錯誤 ?嗎
51.
再看 final 關鍵字 •
如果在指定變數 之後,就不想再改變變數值 ,可以在宣告變數時加上值 final 限定 • 如果物件資料成員被宣告為 final ,但沒有 明確使用 = 指定 ,那表示延遲物件成員值 值 的指定,在建構式執行流程中,一定要有對 該資料成員指定 的動作值
52.
再看 final 關鍵字 •
如果 class 前使用了 final 關鍵字定義, 那麼表示這個類別是最後一個了,不會再有 子類別,也就是不能被繼承 – String 在定義時就限定為 final
53.
再看 final 關鍵字 •
打算繼承 final 類別,則會發生編譯錯誤:
54.
再看 final 關鍵字 •
定義方法時,也可以限定該方法為 final , 這表示最後一次定義方法了,也就是子類別 不可以重新定義 final 方法 – java.lang.Object 上有幾個 final 方法
55.
再看 final 關鍵字 •
如果你嘗試在繼承父類別後,重新定義 final 方法,則會發生編譯錯誤:
56.
java.lang.Object • 定義類別時沒有使用 extends
關鍵字指定 繼承任何類別,則繼承 java.lang.Object
57.
java.lang.Object • Java 中所有物件,一定「是一種」
Object • 如果有個需求是使用陣列收集各種物件,那 該宣告為什麼型態 ?答案是呢 Object[] !
58.
java.lang.Object • 以下定義的 ArrayList
類別,可以不限長 度地收集物件:
59.
java.lang.Object
61.
java.lang.Object • java.lang.Object 是所有類別的頂層父 類別 •
Object 上定義的方法,所有物件都繼承下 來了,只要不是被定義為 final 的方法,都 可以重新定義
63.
java.lang.Object • Object 的
toString() 預設定義為: • 6.2.1 的範例中, SwordsMan 等類別,是重 新定義了 toString() • 許多方法若傳入物件,預設都會呼叫 toString() – 例如 System.out.print() 等方法
64.
java.lang.Object • 6.2.1 的這個程式片段:
65.
java.lang.Object • 在 Java
中要比較兩個物件的實質相等性,並 不是使用 == ,而是透過 equals() 方法 • equals() 方法是 Object 類別就定義的方 法
67.
java.lang.Object • instanceof 運算子可以用來判斷物件是否 由某個類別建構,左運算元是物件,右運算 元是類別 •
編譯器會檢 左運算元型態是否在右運算元查 型態的繼承架構
68.
java.lang.Object • 執行時期,並非只有左運算元物件為右運算 元類別直接實例化才傳回 true
,只要左運 算元型態是右運算元型態的子類 型, instanceof 也是傳回 true
69.
關於 收集垃圾 • JVM
有 收集(垃圾 Garbage Collection, GC ) 機制,收集到的 物件所佔據的記憶體空垃圾 間,會被 收集器釋放垃圾 • 執行流程中,無法透過變數參考的物件,就 是 GC 認定的 物件垃圾
70.
關於 收集垃圾 • 假設你有一個類別:
71.
關於 收集垃圾
72.
關於 收集垃圾
73.
關於 收集垃圾
74.
關於 收集垃圾
75.
再看抽象類別 • 開發一個猜數字遊戲 … •
老 皺著眉頭說:「我有說要在文字模式下闆 執行這個遊戲 ?」嗎
76.
再看抽象類別
77.
再看抽象類別
78.
再看抽象類別