物件導向程式導論
Revised on April 23, 2019
 電腦程式語言
 物件導向思維
 類別定義
 封裝性
 繼承性
 多型性
 UML表示法
第2頁第2頁第2頁
 人類常會開發⼀些⼯具來解決問題
 例如:發明筆來寫字、發明交通⼯具來替代雙腳行走等
 電腦程式語言也是解決問題的⼀種⼯具
 人類必須借助共通語言交談溝通;同樣地,當人類要與電腦溝通時,也必
須使用彼此都能理解的語言,像這樣的語言我們稱為電腦程式語言
(Computer Programming Language)
 電腦程式:利用任何⼀種電腦程式語言所撰寫的指令集
 程式設計:撰寫程式的整個過程
程式設計
2
第3頁第3頁第3頁
 編譯式程式語言
 COBOL、C、C#、C++等
 從原始程式變成可執行檔的過程分成編譯(Compile)及連結(Link)兩階段,
分別由編譯程式(Compiler)及連結程式(Linker)負責
 編譯程式負責檢查程式中的語法是否正確,以及程式中所使用的函式是
否有定義
 當原始程式編譯正確後,接著才由連結程式連結程式中之函式(或方法)
所在的位址(即函式所在的檔案),若連結正確,進而產生原始程式之可
執行檔
 執行效率高
電腦程式語言分類 1/3
3
第4頁第4頁第4頁
 直譯式程式語言
 例如:HTML、Python
 必須經過直譯器(Interpreter)將指令⼀列⼀列翻譯成機器碼並執行
 利用直譯式程式語言所撰寫的原始程式,每次執行都要重新經過直譯器翻
譯成機器碼,若執行過程發生錯誤就停止運作
 執行效率差
電腦程式語言分類 2/3
4
第5頁第5頁第5頁
 結合編譯式及直譯式的程式語言
 其執行速度比純編譯式語言慢⼀些
 Java語言屬於編譯式及直譯式的程式語言之⼀
 Java程式必須經過Java 編譯器(Compiler) 編譯成位元組碼(Byte code)
再經由Java直譯器翻譯位元組碼並執行它
 位元組碼與電腦之作業系統( 例:UNIX/Linux、Windows及Mac OS)
無關,只要在電腦的作業系統中,安裝Java 的虛擬機器(Java
Virtual Machine:JVM),就能執行它。因此,Java 屬於跨平台的程
式語言
電腦程式語言分類 3/3
5
第6頁第6頁第6頁
 程式設計方式可分成下列兩種類型:
 程序導向程式設計(Procedural Programming)
 程式的執行流程是依照程式設計師解題步驟及思考邏輯,應用循序、迴
圈及分支等三種程式架構,控制程式之執行程序
 先思考如何做(Operation)這件事情,再想中間過程需要那些data輔助
 物件導向程式設計(Object Oriented Programming,OOP)
 是以物件(Object)為主軸的⼀種程式設計方式
 是以設計具有特定行為或方法的物件為核心,而不是只單純設計特定功
能的函數或方法
 強調利用物件分⼯與互動,來完成特定的⼯作;先思考有那些data存在,
再針對這些data須要會有那些動作在上面運作
物件導向程式設計 1/2
6
第7頁第7頁第7頁
 在設計時,每⼀類別被賦予特定的功能(methods) 與屬性(Fields或
Properties),經由不同物件的組合(分⼯) 與作用互動,來完成所需
的⼯作
 程式在維護、除錯,及新功能擴充上更容易
 物件藉由它所擁有的方法,存取它所擁有的屬性及與不同的物件做溝
通互動
物件導向程式設計 2/2
方法
...
物件名稱.方法()
...
傳入引數資料
回傳所需結果
7
第8頁第8頁第8頁
 類別(class)與物件(object)
 週遭中存在著許多與我們生活息息相關的物件,例如電腦、原子筆、手機、
汽車…等
 物件也可以是其它物件組合而成,比方說電腦是由主機、螢幕、鍵盤、滑
鼠等物件組成;原子筆由筆蓋、筆桿、筆蕊組成
 同⼀類型的物件彼此間或許有些許差異,但其基本功能及與外界互動的模
式是共通的。例如不同機型的錄音筆雖然造型、顏色、輸出功率…等規格
有所不同,但按Record鍵錄音、按Play鍵放音等操作方法則是共通的
 以物件導向的術語與觀點而言,同⼀類的物件可以有不同的屬性
(property, Java語言稱為fields),但會提供⼀致的操作方法
(methods)
物件導向核心概念 1/10
8
第9頁第9頁第9頁
 類別定義有如規格描述
 車廠在推出新款汽車時,會先設計產品藍圖 (類別設計階段,class
design),然後生產線即可依照產品藍圖生產系列車款 (物件實作階段,
implementation)
物件導向核心概念 2/10
9
休旅車
U6 U5 V7
類別
物件實體
第10頁第10頁第10頁
 資料成員(data member)
 儲存在物件內的資料
 也稱為屬性(Attribute)或"欄位"
 例如:車子具有車型(type)、廠牌(brand)、顏色(color)、排氣量(cc)
等屬性
物件導向核心概念 3/10
10
車型 = 休旅車
排氣量 = 1800
顏色 = 銀灰
廠牌 = Luxgen
第11頁第11頁第11頁
 成員方法(member function)
 方法是⼀種描述類別內部的行為,也就是物件支援的操作行為(功能)
 例如:車子具備發動(startEngine) 、熄火(stopEngine) 、加速
(speeding) 、換檔(shift)等功能
物件導向核心概念 4/10
11
發動
熄火
加速
換檔
第12頁第12頁第12頁
 繼承(inheritance)
 管理上會將物件分⾨別類,同⼀類別的物件都有著共通特性
 子類別架構在父類別的基礎上,繼承(Inheritance) 父類別功能並延伸
自身功能
 例如汽車可分類為轎車、客貨車、休旅車及跑車,由於都歸屬汽車類,
因此有其共通性,但彼此間還是有些差異;表示子類別除了繼承其父類
別共通特性外,還可衍生出自己的獨特性
 繼承性讓子類別與生俱來就具備了特定功能
物件導向核心概念 5/10
12
汽車
轎車 客貨車 休旅車 跑車
父類別
子類別
第13頁第13頁第13頁
 類似生物進化的概念,子類別除了繼承父類別的方法,如果覺得父類別的
方法不理想,也可以加以改良,這種機制稱為覆寫(overriding)
 覆寫是發生在繼承關係中,子類別自行實作⼀個方法來取代父類別所提
供的方法,程式在執行中會執行子類別的方法,而不執行父類別的方法
 覆寫作業時,方法名稱及參數列 (個數、資料型別及擺放順序)必須相
同,回傳型態必須相同或是原方法傳回值型別的子類別,存取權限不可
小於原方法
物件導向核心概念 6/10
13
第14頁第14頁第14頁
 封裝性(encapsulation)
 封裝性是指將物件內部資料保護或隱藏起來,防止有未授權而任意更改物
件內部資料之情形,以免破壞資料完整性,所有內部資料存取只能透過公
開的管道 (成員方法) 來存取
 從資料隱私觀點來看,有些資料是屬於私密性質(private) ,有些訊息則
會公開(public) 與它人分享,而某些資訊則是有限度的公開
(protected),只會讓親朋好友知道
 Java語言的規範中,類別提供的方法可分為public、protected、
package及private四種存取層級
 private是只有自己才能使用,public是提供公開存取,其它則有不同
程度的保護措施
物件導向核心概念 7/10
14
第15頁第15頁第15頁
 多型性(polymorphism)
 動態多型,也被稱為子類型多型(Subtype polymorphism)
 父類別型別的物件變數允許參照到其子類別的物件實體,JVM在叫用方
法時會依據參照變數實際所參照的物件實體,動態連結到正確的物件方
法,在物件導向程式設計中,這被直接稱為多型(polymorphism)
Car sobj = null;
Sedan sedan = new Sedan(1800);
SUV suv = new SUV(2000);
sobj = sedan;
sobj.speeding(); //執行轎車加速
sobj = suv;
sobj.speeding(); //執行休旅車加速
物件導向核心概念 8/10
15
第16頁第16頁第16頁
 靜態多型(static polymorphism)
 允許將不同的特殊行為和單個泛化記號相關聯,由於這種關聯處理於編
譯期而非執行期,因此被稱為「靜態」
 函式多載(Function Overloading)
 物件方法可以是相同名稱,只要引數個數或資料型別可供區別
 運算子多載(Operator Overloading)
 例如+運算子可以是數值加法運算,也可以是字串串接運算
物件導向核心概念 9/10
16
第17頁第17頁第17頁
 套件(package)
 程式架構越來越大,類別個數越來越多,管理程式中維護類別名稱也會是
⼀件⿇煩的事,尤其是⼀些同名問題的發生
 例如在程式中,您也許會定義⼀個Point類別,但另⼀個與您合作開發程
式的開發人員並不曉得已經有這個類別名稱的存在,他可能也定義了⼀個
Point類別,在程式整合時就會發生問題
 Java提供套件來管理類別,套件被設計與檔案系統結構相對應,如果您的
套件設定為edu.nkee,則該類別應該在Classpath可存取路徑下的edu目
錄下之nkee子目錄找到
物件導向核心概念 10/10
17
第18頁第18頁第18頁
 UML(Unified Modeling Language)統⼀塑模語言是⼀種開放的方法,
能讓IT 技術人員建構應用程式的模型
 UML中的類別表示法
 減號(-)表示該屬性或方法為private,正號(+)表示該屬性或方法為
public,#號表示該屬性或方法為protected
 UML中的套件表示法
UML表示法 1/6
18
class name
-data members
+class methods
-class methods
#class methods
套件名稱
第19頁第19頁第19頁
 聚合關係(aggregation)用以表達「整體和部份」的關係,它也隱含
著所謂包含(include)的關係
 聚合關係可以用「is-part-of」、「has-a」或是「has-parts」語
意上的關係來表示
 聚合關係不只是指出物件相互了解的關係,更是它們被集合起來以形
成⼀個新的更複雜的物件
UML表示法 2/6
19
球隊 球員
第20頁第20頁第20頁
 組合關係(composition) 是⼀種比聚合關係更強的包含關係。在⼀
個聚合的關係中,如果整體的消失會造成部分(parts)的消失,那麼
這個聚合是⼀種組合關係
 例如,⼀本書包含有很多章節,如果書沒了,章節也就不存在
 購物系統中有訂單以及訂購項目。當訂單被刪除了,與其相關的各項訂購
資料也會⼀併被刪除掉
 從Java語言來看,內部類別就屬於組合關係
UML表示法 3/6
20
書 章節
訂單 訂購資料
第21頁第21頁第21頁
 ⼀般化關係(generalization)是⼀種分類的關係(taxonomic
relationship),⼀般化講的其實就是物件導向程式語言中的繼承關
念,它可以用「is-a」或「is a-kind-of」關係來表示
 ⼀個判斷⼀般化的簡單原則就是:如果可以用「物件A是物件B的⼀種」
這句話來表達時,A跟B之間就可能存在著⼀般化的關係。例如:秘書
跟⼯程師都是雇員的⼀種,而雇員跟客⼾都是人的⼀種
UML表示法 4/6
21
父類別
子類別
第22頁第22頁第22頁
 在類別圖中,透過⼀般化的關係,父類別的所有特徵、性質以及操作
都會自動被子類別所繼承。也就是說子類別不需要再去定義它們,就
可以自動擁有。適當地使用⼀般化的關係,也可以降低模型的複雜度,
讓模型變得更好擴展以及延伸
UML表示法 5/6
22
學校員工
+姓名: String
−住址: String
教師
+服務科系: String
職員
+服務單位: String
第23頁第23頁第23頁
 相依(dependency)關係是指兩個類別之間語意上的依賴關係。當⼀
個類別「使用(use)」到其他類別所提供的服務時,我們稱這兩個類
別有相依關係
 相依關係的符號表法其箭頭是由使用類別指向被使用類別。下圖顯示
出類別A相依於類別B
 我們可以加上stereotype說明相依關係的真正意思。UML定義了以下
關鍵字:access、bind、derive、import、refine、trace、use,
所以,我們可以利用它們更具體描述類別間的相依關係
UML表示法 6/6
23
Class A Class B
Class A Class B<<uses>>

Java 01 oop introduction