930 likes | 1.11k Views
課程參與度之評估方式. 上課時必須專心聽講,跟上進度,參與討論 扣 分項目 玩線上遊戲一次扣 1 分 玩手機一次扣 1 分 睡覺一次扣 1 分 聊天一次扣 1 分 無法回答老師提出的問題一次扣 1 分 加分項目 主動回答老師的問題一次加 2 分 找出老師程式中的錯誤一次加 1 分 修正老師程式中的錯誤一次加 4 分. 網路程式設計 第四章 Java 語言基礎. 鄧姚文. 大綱. 類別與物件 類別的要項 - 屬性 建構子 方法 套件與存取限定修飾字 物件導向概念範例:射鵰英雄傳. 輸出入套件 byte 類別的使用 char 類別的使用
E N D
課程參與度之評估方式 • 上課時必須專心聽講,跟上進度,參與討論 • 扣分項目 • 玩線上遊戲一次扣1分 • 玩手機一次扣1分 • 睡覺一次扣1分 • 聊天一次扣1分 • 無法回答老師提出的問題一次扣1分 • 加分項目 • 主動回答老師的問題一次加2分 • 找出老師程式中的錯誤一次加1分 • 修正老師程式中的錯誤一次加4分
大綱 • 類別與物件 • 類別的要項-屬性 • 建構子 • 方法 • 套件與存取限定修飾字 • 物件導向概念範例:射鵰英雄傳 • 輸出入套件 • byte類別的使用 • char類別的使用 • byte轉換為char • 檔案存取 • Console與Scanner類別 • 例外處理
前言 JAVA 具有跨平台、物件導向與第三方類別庫豐富等特色 JAVA是一種典型的網路應用程式的語言 java.io完整支援輸入與輸出資料流 java.net網路相關類別庫 java.lang.Thread支援多執行緒 快速設計網路應用程式
4-1 類別與物件 01 package com.ch04; 02 03 public class HelloWorld { 04 public static void main(String[] args) { 05 System.out.println("hello world."); 06 } 07 } • Java語言的基礎要項是「類別(class)」 • 類別的終極目的: • 方便自己或其他人「重覆使用」! • Reusable
4-1 類別與物件 hello world. public static void main(String[] args) 標示程式的進入點 執行的結果印出「hello world」字樣:
Signature(簽章) • Signature(簽章)為副程式的識別依據 • 包括存取限定、傳回型別、副程式名稱、參數型別與數量。 • JAVA稱副程式為『方法』(Method) • 兩個不同的方法 • public static int max(int x, int y) • public static double max(double x, double y) • 兩個相同的方法 • public static int max(int x, int y) • public static int max(int a, int b)
4-1 類別與物件 01 package com.ch04; 02 03 public class BMI { 04 public static void main(String[] args) { 05 float w = 65f; 06 float h = 1.7f; 07 floatbmi = w / (h*h); 08 System.out.println("身體質量指數BMI為:"+bmi); 09 } 10 } • 計算一個人的BMI指數,公式: • 體重(kg)/ 身高(m)2 • 假如體重為65公斤(變數w),身高是170公分(變數h)
4-1 類別與物件 身體質量指數BMI為:22.491348 • 計算一個人的BMI指數 • 類別被執行時會從第5行循序執行到第8行,第7行計算BMI指數得到結果後放入變數bmi,最後第8行印出bmi的結果: • 這樣的程式雖然達到了需求,但是卻不方便日後自己或其他人重覆使用 • 只能複製程式碼區塊去使用,當日子一久,可能也忘記變數w、h的用途是什麼了。
4-1 類別與物件 • 物件 • 依照設計圖(藍圖)建造出實物(豪宅) • 能利用同一張藍圖,再去別的地點建造另一棟豪宅 • 類別就是設計圖
4-1 類別與物件 • 物件 • 依照藍圖,將「實例」建造生成出來,然後才能夠使用,而實例就是Java語言中的「物件」 • 設計好類別應有的資訊或動作後,再依照類別產生出可使用的物件去解決問題
4-2 類別的要項-屬性(Property) 01 package com.ch04; 02 03 public class Person { 04 float weight; 05 float height; 06 } • 例如豪宅的藍圖會加入大門的顏色、樓層數、樓高與門牌號碼等資訊 • 設計一個類別「Person」代表一個人 • Person類別身上有兩個屬性 • float浮點數weight與hieght
4-2 類別的要項-屬性(Property) 01 package com.ch04; 02 03 public class Person { 04 float weight; 05 float height; 06 public static void main(String args[]){ 07 Person p = new Person(); 08 } 09 } 在main方法中,利用new關鍵字將Person類別的物件產生出來:
4-2 類別的要項-屬性(Property) Person類別是一個可以重複使用的設計圖 new Person()-讀取Person類別檔後,執行建構子並建立實體的物件。
4-2 類別的要項-屬性(Property) • 存取點數 • 用小數點「.」存取物件的屬性
4-2 類別的要項-屬性(Property) 01 package com.ch04; 02 03 public class Person { 04 float weight; 05 float height; 06 public static void main(String args[]){ 07 Person p = new Person(); 08 p.height = 170; 09 p.weight = 65; 10 } 11 } • 存取點數 • 將height與weight設定為170與65:
4-2 類別的要項-屬性(Property) • 產生物件並設定初始值要 3 行程式 • 能不能夠減少為 1 行程式呢? • 下一節「建構子」
4-3 建構子 • Constructor,又譯為:建構式、建構方法 • 類別生成物件時會自動執行搭配的建構子 • 方法的名稱和類別的名稱相同,沒有傳回型別 • 用途:設定初值或撰寫必要初始化工作 • 當類別中沒有任何建構子時,Java自動給予一個無參數的建構子 • Default Constructor 預設建構子 • 若類別已經有建構子,則不奉送預設建構子!
4-3 建構子 01 package com.ch04; 02 03 public class Person { 04 float weight; 05 float height; 06 public Person(){ 07 weight = 0; 08 height = 0; 09 } 10 } 建構子是位在類別區塊內的第一階層,與屬性相同,都是屬於類別的元素。 建構子擁有自己的程式區塊,以大括號包圍著,以下是Person類別的建構子:
4-3 建構子 03 public class Person { 04 float weight; 05 float height; 06 public Person(){ 07 weight = height = 0; 08 } 09 public Person(intw, int h){ 10 weight = w; height = h; 11 } 12 } • 建構子的重載(Overloading,又譯為多載) • 設計許多個建構子,適用於各種情況 • 兩個建構子的Person
4-3 建構子 • 建構子的重載(overloading) • 接收「參數(parameters)」 • 將參數的型態與變數名稱放在建構子的小括號內(如int w) • 參數值會跟著使用者傳入時不同而改變 • 變數w是在建構子內的區域變數
4-3 建構子 03 public class Person { 04 float weight; 05 float height; 06 public Person(){ 07 weight = 0; 08 height = 0; 09 } 10 public Person(float w, float h){ 11 weight = w; 12 height = h; 13 } 14 15 public static void main(String args[]){ 16 Person p = new Person(65, 170); 17 // Person p = new Person(); 18 // p.height = 170; 19 // p.weight = 65; 20 } 21 }
4-3 建構子 • 建構子的重載(overloading) • 接收「參數(parameters)」 • 因為Person類別在設計時提供了第二個可傳入體重w與身高h的建構子(第10至13行),所以使用者在生成物件時(第16行)即可使用此建構子,以達到簡易能夠生成物件並同時指定初值的目的。
4-3 建構子 Person(float w, float h){ } Person(float w, int h){ } Person(float w){ } Person(float h){ } • 重載的限制 • 重載建構子時,各個建構子的傳入參數必需有差異性,也就是說各個建構子的傳入參數型態或個數必需是不一樣的。 • 以下幾個範例都可以成為Person類別的建構子:
4-3 建構子 • 重載的限制 • 重載的辨識與變數的名稱無關,主要是以參數個數與參數的型態的組合為辨識其合法與否的標準。
4-4 方法(Method) • 將程式敍述或運算的邏輯程式碼集合在一個區塊中,並賦予該區塊一個方法名稱 • 相當於C語言的 Function • 呼叫該方法名稱即可執行這些被集中起來的程式碼 • 意義上是「功能」或「動作」
4-4 方法 • 存取修飾字 回傳值型別 方法名稱(參數 [,參數2, 參數3]){ • 程式碼 • } • 方法的設計 • 方法的規格 • 存取修飾字 • 限定可呼叫該方法的對象 • public 開放公眾皆可使用 • private 限定在此類別內使用
4-4 方法 • 方法的設計 • 回傳值型別 • 執行完成時回傳結果的資料型別 • void 標示不回傳任何值 • 方法名稱 • 名稱的字首不能使用數字,通常慣例是使用小寫英文,若方法名稱是兩個英文字所組成時,第一個英文字以後,每個字首字母應為大寫 • 例如sayHello()、getHeight()或setMailNotification()等
4-4 方法 public void sayHello(String name){ System.out.println("hello"+name); } • 傳入參數 • 兩個參數之間以逗號分隔 • 一個參數應具備參數資料型態與該參數的變數名稱 • float w • int count • String str • 一個印出"hello"的方法sayHello:
4-4 方法 public float getBmi(float weight, float height){ float bmi = weight / (height * height); return bmi; } • 回傳值 • 方法運作中途或結束時,以return關鍵字回傳一個回傳值 • getBmi計算BMI身體質量指數的方法
4-4 方法 • getter 和 setter • 用於存取物件屬性 • 將成員變數設定為 private,透過 getter 與 setter 存取屬性值,避免屬性值遭到破壞!
練習 • 完成 Person 類別的設計 • 屬性: • 姓名、性別、身高、體重 • 方法: • getBmi() 計算 BMI • toString() 印出個人摘要資訊,例如: • 許蓋功 先生 身高 180 公分,體重 70 公斤,BMI = 21.6 • 俞琍珮 小姐 身高 170 公分,體重 60 公斤,BMI = 20.8 • 提示: • Eclipse 和 NetBeans都有自動產生 getter 和 setter 的功能 • 以 NumberFormat的 setMaximumFractionDigits(1) 設定小數點以下顯示 1 位,以 setRoundingMode(RoundingMode.HALF_UP) 設定四捨五入
4-5 套件與存取限定修飾字 • 套件(類別庫) • 套件package在Java語言指的是類別的分類目錄 • 套件名稱=目錄結構 • 以『公司網域名稱倒著寫』作為套件名稱,就不會和別人的類別混在一起 • 類別愈來愈多時,就必需要為其分類 • 假設一家公司名稱為jsoft,它的套件目錄可以設定為com.jsoft • jsoft公司內有關輸出入的類別可以放在com.jsoft.io套件內
4-5 套件與存取限定修飾字 package com.ch04; public class Person { float weight; float height; (省略) } • 套件(類別庫) • 套件的指定必需放在類別區塊外的第一行,例如Person類別就放在com.ch04套件中,類別的全名則是com.ch04.Person:
4-5 套件與存取限定修飾字 • 存取限定修飾字 • 把子類別比喻為子女,同一個套件內的類別比喻為朋友,而此兩種以為的稱之為外人 • 利用public、private、protected與未定義任何修飾字四種方式,可以為屬性與方法訂定存取模式 • public:所有對象皆能自由存取該屬性。 • private:除了類別內部能夠存取外,其他皆無法存取。 • protected:類別內部、子女及朋友都能存取,但外人無法存取該屬性 • default(又稱預設,不寫任何修飾字):只能被類別內部與朋友存取,其子女與外人皆不能存取。
4-6 射鵰英雄傳 導演想拍攝一幕「洪七公說了一聲看招後,使出降龍十八掌」的戲,該如何做? 導演應該先設計好洪七公這個角色,再找一個場地與演員來真實地演出這場戲。 設計階段就是類別的設計,真實演出時,就是產生物件並呼叫方法。
4-6 射鵰英雄傳 • 設計構思階段 • 洪七公是人,人都有姓名與體力 • 先設計「人」類別 • 日後若有其他角色時,可以重覆使用。 • 「洪七公」類別繼承「人」的特色 • 為「人」類別設計姓名與體力兩個屬性,又加了一個方法「說」,這個方法可以接收一個字串後印出。
人 package com.ch04; public class 人 { String 姓名; int體力 = 100; public void 說(String words){ System.out.println(姓名+"說:"+words); } }
4-6 射鵰英雄傳 • 設計構思階段 • 接著設計洪七公類別 • 『洪七公』是一種『人』 • 透過繼承(extends)取得『人』的屬性與方法 • 將洪七公繼承了「人」類別,並設定其姓名,由於練武之人體力較佳,因此應改變父類別(人)的體力為200。 • 又因洪七公擁有絕世武功,新增了一個新的方法叫「降龍十八掌」,類別設計如下:
洪七公 package com.ch04; public class 洪七公 extends 人 { public 洪七公() { 姓名 = "洪七公"; 體力 = 200; } public void 降龍十八掌(){ System.out.println(姓名+"發出陣陣掌風,使出降龍十八掌"); } }
4-6 射鵰英雄傳 • 演出階段 • 接下來可以演出「洪七公說了一聲看招後,使出降龍十八掌」這幕戲了 • 新增一個具有main方法,可測試的類別叫Tester,用來演出這場戲。 • 先以一個演員hong,依照劇本所設計的洪七公來演出:
演出階段 package com.ch03; public class Tester { public static void main(String[] args) { 洪七公 hong = new 洪七公(); hong.說("看招"); hong.降龍十八掌(); } } 洪七公說:看招 洪七公發出陣陣掌風,使出降龍十八掌 • 執行結果
4-6 射鵰英雄傳 • 進階設計 • 假如的需求是設計有關遊戲的對戰,遊戲中有歐陽峰與洪七公兩個角色 • 歐陽峰擁有體力180,內力值是400,發出蛤蟆功後自己會降低體力值40與內力值50,而對方會失去體力值80。 • 洪七公擁有的體力是200,內力值是500,發出降龍十八掌時自己會降低體力值60與內力值80,而對方會失去體力值120。整理如下表:
4-6 射鵰英雄傳 • 進階設計 • 類別圖:
4-6 射鵰英雄傳 package com.ch04; public class 洪七公 extends 人 { int內力 = 500; public 洪七公() { 姓名 = "洪七公"; 體力 = 200; } public void 降龍十八掌(){ System.out.println(姓名+"發出陣陣掌風,使出降龍十八掌"); } public void 降龍十八掌(人 p){ System.out.println(姓名+"發出陣陣掌風,使出降龍十八掌打向 "+p.姓名); 體力 = 體力 - 60; 內力 = 內力 - 80; p.體力 = p.體力 - 120; System.out.println(" 對手"+p.姓名+"體力剩餘:"+p.體力); } }
4-6 射鵰英雄傳 package com.ch04; public class 歐陽峰 extends 人 { int內力 = 400; public 歐陽峰() { 姓名 = "歐陽峰"; 體力 = 180; } public void 蛤蟆功(){ System.out.println(姓名+"發出呱呱怪聲,使出蛤蟆功"); } public void 蛤蟆功(人 p){ System.out.println(姓名+"發出呱呱怪聲,使出蛤蟆功打向"+p.姓名); 體力 = 體力 - 40; 內力 = 內力 - 50; p.體力 = p.體力 - 80; System.out.println(" 對手"+p.姓名+"體力剩餘:"+p.體力); } }
4-6 射鵰英雄傳 package com.ch04; public class Tester2 { public static void main(String[] args) { 洪七公 hong = new 洪七公(); 歐陽峰 oyan = new 歐陽峰(); oyan.蛤蟆功(hong); hong.降龍十八掌(oyan); } } 歐陽峰發出呱呱怪聲,使出蛤蟆功打向洪七公 對手洪七公體力剩餘:120 洪七公發出陣陣掌風,使出降龍十八掌打向歐陽峰 對手歐陽峰體力剩餘:20 • 實際操作程式 • 執行結果
4-7 輸出入套件 • Java 語言提供許多類別做 I/O(Input / Output)輸入與輸出 • java.io 類別庫 • 輸出入的類別像是「管路」 • 不同的管路可供處理不同的需求功能
4-7 輸出入套件 • 輸出入類別 • 分為以byte或char來處理的類別