Object-Oriented Concepts
1-2
Previous study
• How to link “Java SDK” library– Using path and Classpath
• What benefits of “java”– Compile to byte-code and interpret byte-code
with Java virtual machine
1-3
第一個 Java Application
• Java Application 撰寫流程– 原始碼撰寫– 存檔– 編譯– 執行
1-4
第一個 Java Application
import java.lang.*;
/**
* HelloWorldApp.java
* Use System.out.println to show “Hello World!” on the screen
*/
public class HelloWorldApp {
public static void main ( String[] args ) {
System.out.println("Hello World!");// Print the string
}
}
注意: Java 大小寫有分別
1-5
第一個 Java Application
• 存檔– 檔名: HelloWorldApp.java
• HelloWorldApp: 習慣上與主類別同名• .java: 一定要使用 .java 作為附加名
1-6
Java 程式結構
/**
* HelloWorldApp.java 2001/08/01
* Use System.out.println to show “Hello World!” on the screen
*/
public class HelloWorldApp {
public static void main ( String[] args ) {
System.out.println(“Hello World!”); // Print the string
}
}
註解
主類別
進入點 程式碼
1-7
程式註解 (comment)
• 註解格式– // 我是註解– /* 我也是註解 */– /** 我是註解文件 */– /* 雖然換行 我還是註解 */– // 我是註解
1-8
註解
• javadoc– 功能:產生說明文件– 格式:
• javadoc HelloWorldApp.java• javadoc –d C:\MyDoc HelloWorldApp.java
– 外觀:
1-9
主類別
• 藍色粗體字部份即為主類別。• Java 程式至少要有一個類別,才能順利執行。
/**
* HelloWorldApp.java
* Use System.out.println to show “Hello World!” on the screen
*/
public class HelloWorldApp {
public static void main ( String[] args ) {
System.out.println(“Hello World!”); // Print the string
}
}
主類別
1-10
類別規則
• 主類別名稱要跟檔案名稱大小寫相同– 且在 Java 中,大小寫是有差別的
• 主要以英文字、數字、底線組成,不可以數字開頭,也不可以有空白
• 類別內容的開始與結束以 { } 框起來
1-11
進入點• 藍色粗體字部份即為進入點,為一個程式開始執行的地方。• Java 的進入點名稱為 “ main()” 函數
/**
* HelloWorldApp.java
* Use System.out.println to show “Hello World!” on the screen
*/
public class HelloWorldApp {
public static void main ( String[] args ) {
System.out.println(“Hello World!”); // Print the string
}
}
進入點
1-12
主方法宣告
• 應用程式會從 main 這個方法 (method) 開始執行,一個類別內只能有一個 main
• 可以有其他的方法 (method)• 由命令提示字元來的參數擺在 String[] args
public static void main(String[] args) {…
}
1-13
進入點
main (String[] args)voidstaticpublic
{程式碼寫在此處
}
main: 進入點的函數名稱。一定要取名為 “ main”
(String[] args): 傳遞給 main 的參數。void: main 的傳回值。 void 代表不傳回任何值。static: 宣告 main 是一個靜態函數。public: 宣告 main 函數大家都可以存取。注意 !! Java 每行程式後方都要以分號 “ ;” 分開。
回到原主題
1-14
函式呼叫 (function call)
• System.out– JAVA 標準的系統輸出– 將要印的字印到命令提示字元– 其他的如 System.out.print ( 沒有換行 )
System.out.println("Hello World!");
1-15
編譯程式
• 利用 javac 這個程式• 範例:
–javac HelloWorldApp.java• 成功的話,不會有任何訊息,並產生HelloWorldApp.class ,也就是 ByteCode中間碼 ( 位元程式碼 )
1-16
執行程式
• 利用 java 這個程式• 範例:
–java HelloWorldApp• 不需要加 .class 或是 .java• 會執行該 class 中的 main 函式
1-17
換行字元
• 換行 : \n• tab 定位 : \t• 反斜線 : \\• 雙引號 : \”
System.out.print(“\”Hello\tWorld!\\\n");
1-18
世界上有兩種程式設計師
• 你想當…
• 最厲害的程式設計師– 寫出最好的程式碼
• 最聰明的程式設計師– 拿最好的程式碼,組合出更好的程式碼
1-19
程式設計方法
• 「軟體工程」( Software Engineering )– 研究如何建立正確、可執行和良好撰寫風格的
程式碼,嘗試使用一些已經驗證過且可行的方法來解決程式的問題。
• 「程式設計」( Programming )– 使用指定的程式語言來解決問題的程式設計方
法。
1-20
程式設計方法
• 學習程式設計需要經歷數個學習過程,即四種「程式設計技術」( Programming Techniques ),或稱為「程式設計風格」( Programming Styles ),如下所示:– 非結構化程式設計( Unstructured Programming )。
– 程序式程式設計( Procedural Programming )與結構化程式設計( Structured Programming )。
– 模組化程式設計( Modular Programming )。– 物件導向程式設計( Object-Oriented Programming )。
1-21
非結構化程式設計
• 早期的 BASIC 和組合語言都屬於非結構化程式設計。
• 主要是指不論大小程式都只擁有一個main() 方法,而且程式碼是以線性方式依序的執行。
1-22
非結構化程式設計問題
• 在開發大型程式時,會產生的問題:–重複的動作會產生重複的程式碼– 如利用 goto
•增加程式的複雜度• 產生一些無用的程式碼片斷
–資料都屬於「全域」( Global )資料,容易誤改
1-23
程序式與結構化程式設計
• 程序式程式設計是將程式中重複的程式片斷抽出成為「程序」– ( Procedures ,或稱為Subroutine 、 Routine )或「函數」( Functions )。
– 間接將資料宣告成區域變數 (Local Variable)
1-24
程序式與結構化程式設計
• 因為程式已經分割成程序,所以在 main() 方法的程式碼只是依序呼叫各程序( Procedure Call ),來完成任務。
• 整個程式使用流程控制連接各程序,即構化程式設計。
1-25
模組化程式設計
• 模組化程式設計是為了能夠重複使用分割建立的程序– 將相同功能的函數結合在一起成為獨立的「模組」
( Modules ),模組是一個處理指定功能的子程式。
1-26
程序型與模組型之差異
• 程序– 與主程式相依,無法替換– 移除會影響主程式運作
• 模組– 具有特定規格的介面與資料結構,可以替換成其他類似功能的模組
– 視情況可以移除,不影響主程式運作,只是會缺少一些功能
1-27
物件導向程式設計
• 物件導向程式設計是一種程式設計的方法,將原來專注於問題的分解,轉換成了解問題本質的資料,也就是「物件」( Object )。
• 程式是由物件組成,物件內含處理的資料和相關程序,物件是使用訊息來溝通合作以解決問題。
1-28
物件導向技術
• 物件導向分析 (OO Analysis)–了解問題與需求
• 物件導向設計 (OO Design)– 將需求萃取成物件模型 (抽象化 ) ,或邏輯概念圖
• 物件導向程式 (OO Programming)– 將邏輯設計轉換成實際程式碼
1-29
物件導向程式技術
• 演戲– 寫好劇本與對白 ( 分析與描述問題 )–找好演員與道具 ( 物件 )– 開始演 ! ( 執行程式 )
• 每個場景需要哪一些演員與道具上場•怎麼演才可以表達出劇情
1-30
抽象資料型態
• 物件導向程式設計的精神是資料抽象化– 為了在電腦中描述真實世界的各種實體東西– 透過抽象資料型態建立電腦與真實世界的橋樑
• 程式設計的目的是解決問題 ,也就是將生活中的真實問題轉換成電腦程式
• 真實問題可能很複雜,必須抽出其重點部分來解決
1-31
抽象化目的
• 將問題轉換成模型的方式稱為「抽象化」( Abstraction ),在電腦技術中,其主要的目的是定義問題的二個屬性:– 資料( Data ):問題影響的資料。– 操作( Operators ):問題產生的動作。
1-32
物件導向的抽象資料型態
• 物件導向程式語言的抽象資料型態,在 Java 語言就是「類別」( Class )。– 將具有同一類型資料和介面的物件分成一類
• 將個人基本資料問題抽象化成 Person 模型,對應真實世界中人的實體– 內含姓名 name 、地址 address 和電話號碼 phone等資料
– setPerson() 指定個人資料, getName() 、 getAddress() 和getPhone() 取出個人資料的操作
1-33
抽象資料型態與物件導向
• 物件導向程式設計的精神是資料抽象化– 每一個物件屬於一種抽象資料型態– 物件導向將問題的資料和該資料的相關操作一起思考
1-34
物件導向的思維
• 物件導向技術源於 1960年代的 Simula 程式語言,它是 Simulation Language 的簡稱,這是一種模擬語言,希望使用電腦程式來模擬真實世界的各種處理過程。
• 換句話說,物件導向的思維就是現實生活的思維方式– 其實大家早已知道,而且一直使用它。
1-35
物件
• 你的四周–人 , 動物 , 植物 , 車子等等
• 物件中所包含有–狀態 (Stats, 內在資料 )
• 大小 , 形狀 , 顏色 , 重量等等– 行為 (Behaviors, 外在操作介面 )
•車子可以發動、停車、加速和換擋等等
1-36
從案例中學習識別物件
• 物件導向思維的重點是如何從描述的問題中識別出物件,以便建立問題的模型,可能的方法如下:– 問題中是否有【具體的事物】,例如:人、書、電腦、車子等。
– 問題中是否有【事件】,例如:訂購商品、借書、參加會議、旅遊等。
1-37
從案例中學習識別物件 - 物件特徵 1
• 保留資訊( Retained Information ):物件需要能夠保留資訊,所以物件一定擁有一些屬性,即資料。
• 需要提供服務( Needed Service ):物件需要能夠提供服務,例如:更改屬性的操作。
• 共通屬性( Common Attributes ):所有出現的物件都擁有共通的屬性。
1-38
從案例中學習識別物件 - 物件特徵 2
• 共通操作( Common Operators ):所有出現的物件都擁有共通的操作。
• 本質的需求( Essential Requirements ):擁有其它外部的實體物件,它需要取得物件的資訊,例如: Order訂單物件需要取得Customer客戶物件的【地址】屬性。
• 多重屬性( Multiple Attributes ):物件擁有的屬性並非只屬於它,它可以是一個更大物件的屬性。
1-39
物件導向技術的觀念
• 物件導向技術有三個重要觀念– 物件:提供資料和處理資料程序的封裝– 訊息:物件間的溝通方式,建立物件互動和支援多型的觀念
– 類別: 將有相同特性的物件,歸納成同一類抽象資料型別
1-40
物件( Object )觀念
• 物件是對應到現實生活的實體或事件,擁有三種特性:狀態、行為、識別字– 狀態( State )
• 物件內部包含的資料– 可以是一個變數– 例如:車子的車型、排氣量、色彩和自排或手排等屬性。
1-41
物件( Object )觀念 -特性
• 行為( Behavior )– 物件的方法 (methods)
• 來產生行為– Java 語言是使用方法來實作行為– 例如:車子可以發動、停車、加速和換擋等。
1-42
物件的狀態與行為 (變數與方法 )
1-43
物件( Object )觀念 -特性
• 識別字( Identity )– 每個物件都擁有獨一無二的識別字,用來
與其他的物件做區別• 在記憶體中有個唯一的位址
–Java 語言是使用物件參考( Reference )作為物件的識別字。
1-44
物件( Object )觀念 - 範例
• 使用 MySentraCar 物件模擬 1800cc紅色四門的Sentra車子– MySentraCar 是物件的識別字,有別於眾多其它車輛的物件
• 狀態– 車型( type )、排氣量 (cc) 、色彩 (color) 、幾門 (door) 。
• 行為– 發動( starting )、停車( parking )、加速
( speeding )、換檔( shift )。
1-45
物件( Object )觀念
• 使用 MySentraCar 物件模擬車輛時,是使用變數儲存目前的狀態值,建立方法來模擬行為,如下所示:– 變數:type=Sentra 、 cc=1800 、 color=red、 door=4 。
– 方法:starting() 、 parking() 、 speeding() 、 shift() 。
Quiz
• So many brands and types– BMW, Nissan, Toyota, Lexus, VOLVO, audi,
Benz– Toyota
• VIOS, Altis, Premio, Yaris, Wish
• How to apply OO concepts?
1-46
Example1
• 今天上課講的整數與人的例子• 解開 Example1.zip• Javac *.java• Java Example1
1-47
Exercises
• 以物件導向思考,試圖將生活中的東西以物件導向方式來描述
• 看看以前寫的 C code,想想如何用物件導向來改寫?
1-48