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