SCJP ch17
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

SCJP ch17

on

  • 357 views

 

Statistics

Views

Total Views
357
Views on SlideShare
357
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

SCJP ch17 Presentation Transcript

  • 1. 第 17 章 Java 標準類別庫 本投影片(下稱教用資源)僅授權給採用教用資源相關之旗標書籍為教科書之授課老師(下稱老師)專用,老 師為教學使用之目的,得摘錄、編輯、重製教用資源(但使用量不得超過各該教用資源內容之 80% )以製作為 輔助教學之教學投影片,並於授課時搭配旗標書籍公開播放,但不得為網際網路公開傳輸之遠距教學、網路教 學等之使用;除此之外,老師不得再授權予任何第三人使用,並不得將依此授權所製作之教學投影片之相關著 作物移作他用。 著作權所有 © 旗標出版股份有限公司
  • 2. 學習目標  認識 Java 語言的標準類別庫  學習使用內建的數學運算方法  熟悉基本資料類別  學習 Math 、 Date 、 Calendar 類別的相關應用  學習日期、數值、貨幣的格式化方法  學習搜尋字串與分解字串的技巧
  • 3. 前言  前幾章我們開始接觸到 Java 平台提供的各種 『功 能』 , 像是執行緒、例外處理、串流類別等。  這些『功能』都是內建在 Java 標準類別庫 (Standard Class Library) 中 , 或是稱為 Java API (Application Programming Interfaces, 應用程式介 面 ) , 只要在程式中使用這些現成的類別及方法 , 就 可進行複雜的工作 , 例如用 BufferedReader 以緩衝 方式讀取檔案或鍵盤輸入。  本章將介紹更多實用的 Java API, 方便您撰寫各式 各樣的 Java 程式 , 利用程式來解決各式各樣的問題
  • 4. 17-1 甚麼是 Java 標準類別庫?  到目前為止 , 我們已學到的 , 大多屬於『 Java 程式 語言』的部份 , 包括變數、運算式、流程控制等基本 語法要素 , 以及物件導向的語法:類別、繼承等等。  不過如同第 1 章所介紹的 , Java 語言要發揮功能必 須有個可供 Java 程式執行的 Java Platform (Java 平台 ) 環境。  Java Platform 包含兩大部份: ▪ JVM ▪ Java API
  • 5. 甚麼是 Java 標準類別庫?  JVM 提供一個讓 Java bytecode 程式執行的環境 , 而 Java API 則是一套內含相當多類別、介面定義的集合 , 同版本 Java Platform 所提供的 Java API 種類、數量 都相同 , 所以我們可稱之為 Java 標準類別庫 (Standard Class Library) 。  就好像我們可以從大賣場的倉庫中找到許多不同用途的 百貨用品、食品 , 我們也能從 Java 標準類別庫這個 Java 程式設計人員專用的倉庫中 , 找到各式各樣的類別 來使用 , 讓程式發揮不一樣的功能。  Java 標準類別庫中的類別 , 已依其屬性適當分成多種不 同的套件 , 以 JavaSE (Standard Edition) 這個 Java Platform 為例 , 其 Java API 部份提供了如下圖所示的 多種套件。
  • 6. 甚麼是 Java 標準類別庫?
  • 7. 甚麼是 Java 標準類別庫?  每個套件名稱也都暗示了其功能及用途 , 像是前一章 介紹的 java.io 套件就是有關輸入與輸出的類別集合 ;而圖中的 Security 所指的 java.security 套件 , 則是與安全性有關的類別集合。  在眾多的套件中 , 有關圖形使用者介面及繪圖的幾個 套件 , 例如上圖有一列包括 AWT 、 Swing 、 Java 2D , 這三項合稱為 Java Foundation Classes ( 簡稱 JFC), 在附錄 A 就會介紹這部份套件的用法。
  • 8. 甚麼是 Java 標準類別庫?  如圖示 , Java API 的內容相當多 , 也不是一本入門 書可介紹完的 , 因此本書只能做重點式的介紹。前一 章我們介紹過 java.io 套件中的輸出入類別和介面 , 本章則要介紹以下 3 個套件中一些實用的類別: ▪ java.lang :顧名思義 , 此套件包含了 Java 語言最基 本的核心類別 , 其中包括我們已學過的字串、執行緒 、及例外類別 , 都屬於此套件。 而本章要介紹的則是可讓我們處理數字的 Math 類別 , 以及可用來包裝基本資料型別的『基本資料類別』。
  • 9. 甚麼是 Java 標準類別庫? ▪ java.util :這個套件有如 Java 程式設計的萬用工具 箱 , 提供了開發各種程式都可能會用到的輔助性類別。 例如處理日期的 Date 、 Calendar 類別 , 設定國別 語系的 Locale 類別 , 搜尋與分解字串的 regex.Pattern 、 regex.Matcher 、及 Scanner 類別 等。 ▪ java.text :提供將資料格式化的類別 , 例如 DateFormat 可進行日期的格式化 , 以及 NumberFormat 可進行數值與貨幣的格式化。
  • 10. 查 看 Java API 文件  當然在整個 Java API 中還有很多功能強大且實用的 類別 , 也許您會發現有某個套件對解決您的問題更有 幫助。  但限於本書篇幅 , 我們無法一一介紹所有的類別 , 若 您想認識一下 Java API 中到底有哪些套件、類別可 使用 , 建議直接連上昇陽公司的 Java 線上文件網站 (http://java.sun.com/javase/6/docs/) 一探究竟。
  • 11. 查 看 Java API 文件
  • 12. 查 看 Java API 文件
  • 13. 查 看 Java API 文件
  • 14. 查 看 Java API 文件 ▪ 您也可先在左上框中點選要查閱的套件 , 則左下框即 會篩選出該套件中的所有類別 , 以供您點選查閱。
  • 15. 17-2 基本資料類別  第 11 章提過 , java.lang 中有一組特別的類別 , 是 專用於以物件的方式包裝 Java 基本資料型別 , 所以 可稱之為基本資料類別 (Primitive wrapper class) 或 包裝類別 (Wrapper class) 。  為什麼要用物件的方式包裝基本型別呢?  因為在某些狀況下 , 您要處理的雖然是整數、浮點數 等資料型別 , 但要利用的工具卻只接受物件形式的資 料 , 此時就要先將基本資料型別包裝成物件再來進行 處理 , 在下 一 章要介紹的 Java Collection 就是這 類『工具』的代表性範例。
  • 16. 基本資料類別  此外這些類別也提供許多實用的 static 方法 , 讓我 們方便進行資料格式的轉換 , 例如我們每次從鍵盤取 得輸入的字串 , 就會呼叫這些方法將字串轉換成所需 的格式 ( 像是 Integer.parseInt() 方法 ) 。  本節我們先來進一步認識這些包裝類別 , 每個基本資 料型別都有其對應的包裝類別 , 如下:
  • 17. 基本資料類別  除了 Boolean 、 Character 外 , 其它幾個類別都是 Number 這個抽象類別的子類別。  而且這幾個用來存放數值的類別 , 都有提供一組相似 的方法 ( 例如常用的 parseInt() 、 parseDouble() 等)。  基本資料類別有個重要的特性不可不知:包裝成物件 的數值或字元等 , 其值是無法改變的。  一方面是這些類別都沒有提供修改物件內含值的方法 ;再者基本資料類別都是 final 類別 , 所以我們也不 能從其衍生可更改數值的新類別。
  • 18. 基本資料類別  這樣的設計其實是可以理解的 , 畢竟使用基本資料型 別的變數已非常方便 , 平常不需多費一道工夫將它們 包裝成物件來用。  以下我們就先來看如何建立包裝類別的物件及取出物 件中的資料。
  • 19. 17-2-1 建立基本資料類別物件  建構方法  取得物件的值  基本資料類別的常數
  • 20. 建構方法  建立基本資料類別的物件 , 相當於將基本型別的變數 值裝到物件中。  建立的方法很簡單 , 就是直接以 new 呼叫類別的建 構方法 , 例如建立一個 Boolean 物件可用如下的程 式:
  • 21. 建構方法  關於各類別的建構方法簡單整理如下: ▪ Character 類別的建構方法只接受字元型別的參數。 ▪ Boolean 、 Byte 、 Double 、 Integer 、 Long 、 Shor t 類別的建構方法 , 只接受其對應型別的變數、字面 常數或字串為參數。例如上述的例子中 , 就用布林變 數和字串建立 Boolean 類別的物件。下面是 Short 的範例:
  • 22. 建構方法 ▪ Float 除了能用 float 型別和字串為建構方法的參數 , 也能直接用 double 型別的變數當參數呼叫建構方法 , 不需自行將參數做強制型別轉換。
  • 23. 取得物件的值  當我們將基本資料型別包裝成物件後 , 可透過類別所 提供的多種方法 , 將其值取出使用。  這些類別至少都提供一種 xxxValue() 方法可傳回物 件的值 , 其中 xxx 需代換為基本資料型別的名稱 , 例如 Boolean 物件可使用 booleanValue() 方法、 Character 物件可使用 charValue() 方法。
  • 24. 取得物件的值  至於各 Number 類別的子類別就較具彈性 , 它們的 物件可呼叫下列傳回數值型別的方法 , 因為這些方法 都是繼承自 Number 抽象類別 , 這些方法包括:
  • 25. 取得物件的值  使用上列方法時要注意 , 對範圍較大的物件 ( 例如 Double), 取其較小範圍的基本資料型別 (byte), 就可 能發生無法表示的情形 , 請參考以下範例程式:
  • 26. 取得物件的值
  • 27. 取得物件的值
  • 28. 取得物件的值 1. 第 7 、 8 行分別建立 Integer 、 Double 類別物件 。 2. 第 11 、 14 行分別以基本資料類別的物件為參數 , 呼叫自訂的 showall() 方法進行示範。 3. 第 17 〜 25 行自訂的 showall() 方法 , 只是單純 呼叫各類別的 xxxValue() 方法並輸出結果。此方 法宣告的參數為 Number 類別的物件 , 所以程式中 可用 Integer 、 Double 類別的物件為參數呼叫之 。
  • 29. 取得物件的值  如執行結果所示 , 當物件的數值超出取值方法傳回的 基本資料型別所能表示的範圍時 , 經常會出現不可預 期的結果。  例如上例中的 123456789 轉成 byte 和 short 時分 別變成 21 、 -13035, 而轉成 float 型別時 , 也產生 一點誤差變成 1.23456792E8 ( 相當於 123456792) 。  至於倒數第 4 個輸出的 Infinity, 則是 Java 特別定 義的常數 , 代表無限大的意思 ( 因為 5.376543e200 遠超過 float 可表示的範圍 ) , 以下就來認識基本資
  • 30. 基本資料類別的常數  除了 Boolean 類別外 , 其它幾個基本資料類別都有 定義至少 3 個 static 變數 , 用以表示一些常數值。  其中最普通的一類常數 , 就是表示各基本資料型別的 數值範圍 ( 可表示的最大值及最小值 ) , 以及各型別 的大小 ( 所佔的位元數 ) 。  各型別的這 3 個常數值如下表所示。
  • 31. 基本資料類別的常數
  • 32. 基本資料類別的常數  除此之外 , 浮點數的 Float 、 Double 類別 , 分別各 有 3 個代表極限值及非數值 (Not-a-Number, NaN) 等特殊值的 static 變數:
  • 33. 17-2-2 基本資料類別與字串  認識基本資料類別物件的建立及取值方式後 , 我們再 多介紹一些與字串相關的方法。  這些方法大概可分為幾類: ▪ 從字串建立類別物件:此類方法和前面介紹的建構方 法有點像 , 可將一字串轉成數值型的類別物件。但建 構方法的字串只能用十進位表示 , 而以下要介紹的方 法不但可接受以不同數字系統表示的字串 , 而且是屬 於 static 方法。 ▪ 從類別物件產生字串:各資料類別物件都可呼叫特定 方法將其值轉成字串表示。
  • 34. 基本資料類別與字串 ▪ 將基本資料型別轉成字串:這類是各類別提供的 static 方法 , 可用來將各基本資料型別轉成字串表示 。 ▪ 將字串轉成基本資料型別:同樣是 static 方法 , 而且 我們已用過多次 , 每次由鍵盤取得輸入時的用的 Integer.parseInt() 、 Double.parseDouble() 就屬此類 。
  • 35. 從字串建立類別物件  除了 Character 類別外 , 各基本資料類別至少都提 供一個 static 的 valueOf() 方法 , 只要以適當格式 的字串呼叫之 , 即可傳回該類別的物件。例如:
  • 36. 從字串建立類別物件  整數型類別除了有類似上列的 valueOf() 方法 , 還有 個多重定義的版本可指定此字串所採的數字系統:  以上僅列 Integer 類別的 valueOf() 方法 , 其它 Byte 、 Short 、 Long 也都有這個方法可用 , 但它們 的傳回值都是該類別所對應的型別 , 請參考下列程式 。
  • 37. 從字串建立類別物件
  • 38. 從字串建立類別物件
  • 39. 從字串建立類別物件 1. 第 7 〜 10 行宣告 4 個以不同數字系統表示的數 字字串。 2. 第 12 〜 15 行分別呼叫各整數型類別的 valueOf() 方法將字串轉換成數字物件 , 並輸出結果。  使用 valueOf() 方法時要特別注意:如果字串內容 不符合數字格式、或是數字超出物件可表示的範圍 ( 例如在上列程式中將 str16 轉成 Byte 物件 ), 都 會引發 NumberFormatException 例外。
  • 40. 將類別物件、資料型別轉成字串  在第 11 章已提過所有基本資料類別都有實作各自的 toString() 方法 , 可將物件轉換成字串表示 , 所以我 們能在 print() 、 println() 方法中直接將之輸出 , 或 者轉成字串來處理。  除了將物件轉成字串外 , 各數值型的類別也都支援以 類別名稱來呼叫 toString() 的方法 , 可將其對應的基 本資料型別變數轉換成字串。
  • 41. 將類別物件、資料型別轉成字串  但各類別的 toString() 方法都只能將數值轉成 10 進位制的字串表示 , 若想轉成 2 進位、 8 進 位、 16 進位、甚至於其它數字系統等方式來表示 , 則需使用只有 Integer 、 Long 類別才提供的下列方 法:
  • 42. 將類別物件、資料型別轉成字串  此處所列為 Integer 類別的方法 , Long 類別也有一 組同名的方法 , 只不過它們接受的參數型別為 long 。  以下就是使用這些方法將整數轉成不同進位表示的字 串範例:
  • 43. 將類別物件、資料型別轉成字串
  • 44. 將類別物件、資料型別轉成字串 1. 第 7 、 8 行分別宣告 int 、 long 型別的變數 , 以 供程式轉成字串。 2. 第 10 〜 13 行分別呼叫各 toXxxString() 方法將字 串轉換成數字物件 , 並輸出結果。
  • 45. 將字串轉成基本資料型別  基本資料類別也提供多個方法 , 可將字串轉成基本資 料型別。  其中有一類方法 , 就是每次從鍵盤取得輸入時 , 用來 將字串轉成基本資料型別的 Integer.parseInt() 、 Double.parseDouble() 等方法 。  這幾個基本的 parseXxx() 方法我們都已用過多次 , 就不再多介紹。
  • 46. 將字串轉成基本資料型別  比較特別的是 , 整數型的類別所提供的 parseXxx() 方法 , 也有另一種形式 , 可加上待轉換字串是用哪一 種數字系統的參數 , 如此就能將不同進位表示的字串 轉成基本資料型別:
  • 47. 將字串轉成基本資料型別  我們直接來看以下的應用實例:
  • 48. 將字串轉成基本資料型別
  • 49. 將字串轉成基本資料型別
  • 50. 將字串轉成基本資料型別
  • 51. 將字串轉成基本資料型別 1. 第 12 〜 35 行以迴圈的方式讓程式會一直循環請 使用者輸入數字 , 並進行轉換。 2. 第 18 〜 29 行的 try 段落主要是預防第 19 、 27 行轉換數字時發生格式錯誤的例外。 3. 第 21 行用 if 判斷使用者是否輸入 0, 是就跳出迴 圈 , 結束程式。 4. 第 30 〜 34 行的 catch 區塊會捕捉 NumberFormatException 例外 , 並輸出一段訊息。 catch 區塊結束後 , 仍會重新執行迴圈。
  • 52. 將字串轉成基本資料型別  Character 類別也有一個類似的方法 , 可將字元轉成 數字:  例如 Character.digit('A', 16) 會傳回 10( 在 16 進 位中 , A 代表 10 進位的 10) 。  但 digit() 方法並不會在第一個參數超出範圍時拋出 例外 , 而是會傳回 -1, 例如 Character.digit('A', 8) 就會傳回 -1 。
  • 53. 將字串轉成基本資料型別  另外還有個類似的方法則是:  這個方法是將英文字母接續在數字 0 〜 9 後面排列 ( 不分大小寫 ), 例如:  除了英文字母外 , Unicode 中定義的羅馬數字也會傳 回代表的數值 , 例如:
  • 54. 17-2-3 基本資料類別所提供的其它方法  除了上述各種轉換方法外 , 基本資料類別也提供一些 簡單實用的『工具』方法 , 可讓我們對物件的值做其 它處理。
  • 55. 字元的判斷與轉換方法  前述介紹的多種方法 , Character 類別大多並未提供 , 不外是因為單一字元與數字 / 字串間的轉換的實用性 並不大。  但 Character 類別其實有提供相當多的 static 方法 , 可做字元的判斷和轉換。
  • 56. 字元的判斷與轉換方法  首先介紹一些判斷字元的方法 , 也就是判斷字元是不 是屬於某一特別的類別 , 例如:  這些方法的傳回值都是 boolean 型別 , 是該類字元 就傳回 "true" 、不是就傳回 "false" 。關於空白字元 要說明一下 , 舉凡空白、 't' 、 'n' 等都算是空白字
  • 57. 字元的判斷與轉換方法  以下是個利用字元方法的簡單範例:
  • 58. 字元的判斷與轉換方法
  • 59. 字元的判斷與轉換方法  由執行結果可發現: ▪ 不論中英文 , 每個字 ( 母 ) 都視為一個字元。 ▪ 即使按了多下 [Tab] 鍵產生很寬的空白 , 每個 [Tab] 鍵仍只計為 1 個空白字元 , 所以程式會計算為 "6 個 空白字元 " 。 ▪ 程式並未計算標點符號 , 所以輸入的標點符號都會被 忽略。
  • 60. 字元的判斷與轉換方法  至於轉換字元的方法則有下面 2 個:  這 2 個方法都會傳回轉換後的字元 , 如果參數 ch 不是有大小寫分別的字元 , 就傳回原來的字元。因此 像下列敘述也不保證會傳回 true :
  • 61. 比較的方法  要做基本資料類別物件間的比較 , 若只是看兩者是否 相等 , 可使用第 11 章介紹的繼承自 java.lang.Object 的 equals() 方法。  若要比較誰大誰小的話 , 可使用除了 Boolean 類別 以外 , 其它類別都提供的 compareTo() 方法:
  • 62. 比較的方法  以上為簡化表示 , 所以將參數型別寫成 "Object" , 實際 上各類別的 compareTo() 方法都只能比較同類別的物件 。  若參數物件是不同類別 , 則會引發 ClassCastException 例外。 ▪ 注意 , == 是用來比較是否為同一個物件 , 而 equals() 是 用來比較物件的意義 ( 內含值 ) 是否相等 , 請不要混為一 談。此外 , 當包裝物件與基本型別資料進行 == 比較時 , 包裝物件會先轉換成基本型別資料 , 因此會針對其內含值 做比較 , 而非比較是否為同一物件。 ▪ 包裝類別的變數也有可能是 null 參照 , 例如『 Integer i; 』 , 則因 i 未參照到實體 , 所以其值為 null, 而非 0 。
  • 63. 17-3 Math 類別  在前面幾章 , 我們就曾使用過 java.lang 套件中的 Math 類別所提供的功能 , Math 類別提供了一組方 便我們進行各種數學運算的方法。  我們可做如下的比喻: Java 的加減乘除運算子提供 了普通計算機的計算功能 , 而 Math 類別則提供了 『工程型』計算機的計算功能。
  • 64. Math 類別  Math 類別除了提供多種計算方法外 , 還定義了兩個 static 常數:  因此在程式中可直接用這兩個常數進行相關計算。以 下就來分類介紹 Math 類別中的各種方法。
  • 65. 17-3-1 比較方法  我們要介紹的第一組 Math 類別的方法是簡單的比較 方法。  這些方法會比較兩數字 , 並傳回其中的最大值 (max() 方法 ) 或最小值 (min() 方法 ) 。  雖然像這樣的運算 , 我們也能用簡單的 if/else 或以 比較運算字 (?:) 來做;但在寫程式時 , 使用 Math 提供的方法 , 仍不失為一種簡單而快速的方案。
  • 66. 比較方法  這兩個方法各有下列 4 種 , 以用於不同的參數類型 :
  • 67. 比較方法  其實 Math 類別本身也是用比較運算子 ?: 來設計上 列傳回較大值或較小值的方法 , 不過當程式的敘述較 為複雜時 , 直接用 Math 類別提供的方法 , 會比我 們自己在程式敘述中用 ?: 運算字 , 更容易閱讀及瞭 解。  上述方法的用法可參考以下範例。
  • 68. 比較方法
  • 69. 17-3-2 求絕 對值 與近似值  除了 min() 、 max() 外 , 另一組 Math 類別提供的 簡單方法就是求絕對值與近似值。  這些 static 方法如下所示:
  • 70. 求絕 對值 與近似值  初學程式設計者可能對 ceil() 與 floor() 方法不太熟 悉 , 其實它們的意義很簡單: ceil 是天花板的意思 , 所以 ceil() 傳回的是大於或等於參數值的最小整數; 而 floor 則是地板 , 所以 floor() 會傳回小於或等於 參數值的最大整數。  至於 rint() 、 round() 的計算方式雖然不太相同 , 但 多數情況下其計算結果都相同 , 只是傳回值的型態不 同。  這幾個方法的應用方式 , 請參見以下範例。
  • 71. 求絕 對值 與近似值
  • 72. 求絕 對值 與近似值
  • 73. 求絕 對值 與近似值  在此要補充說明上述方法的一些特別狀況: ▪ 呼叫 Math.ceil() 時的參數值若小於 0 、大於 -1, 則 傳回值會是 -0.0 。 ▪ 呼叫 Math.round() 時的參數值若小於 Integer.MIN_VALUE, 則傳回值為 Integer.MIN_VALUE ;若大於 I n teger.MAX_VALUE, 傳回值會是 Integer.MAX_VALUE 。 ▪ 同理 , 呼叫 Math.round() 時的參數若小於 Long.MIN_VALUE 或大於 Long.MAX_VALUE, 則分 別傳回為 Long.MIN_VALUE 或
  • 74. 17-3-3 基本數學計算方法  介紹了 Math 類別中一些簡單的方法後 , 接下來要 開始介紹進行較複雜運算的方法。  首先來看幾個基本的計算功能:
  • 75. 基本數學計算方法  pow() 、 sqr t ( ) 、 cbr t ( ) 方法的用法都很簡單 , 應不必再加說明。  至於 exp() 、 log() 方法雖然一般人不太會用到 , 但 在微積分的領域則是很常看到 , 舉凡數學、物理、金 融、財務等各種領域 , 都會看到用到自然對數的計算 式 , 在此我們就不深入探討。  以下就是一個使用 pow() 來計算定期存款本利和的 範例。
  • 76. 基本數學計算方法
  • 77. 基本數學計算方法
  • 78. 基本數學計算方法 1. 在第 12 〜 18 行分別取得利率、及存款年數。 2. 第 24 行用 Math.pow() 方法來計算複利計算時的 本利和。算出來的結果 , 再用前一章介紹的格式化 輸出方式 , 以 printf() 方法及 "%.1f" ( 只顯示小數 後 1 位 ) 的方式輸出。
  • 79. 17-3-4 產 生亂數方法  所謂亂數就是一個由電腦隨機產生的數字 , 就像請大 家隨便想一個數字寫下來 , 每次想的都可能不同、各 數字彼此間也沒什麼關聯性 , 就叫亂數。  在撰寫某些應用程式時就很需要用到亂數方法 , 最普 遍的例子就是遊戲程式 , 例如射擊遊戲中的射擊目標 每次出現的位置、行動方向都要不同 , 這時就需利用 亂數產生器來產生一個隨機數字 , 以決定射擊目標的 出現位置、行動方向等性質。
  • 80. 產 生亂數方法  Math 類別的 random() 方法就是個會傳回『亂數』 的方法 , 它會隨機傳回大於等於 0 、小於 1 之間的 倍精度浮點數 , 讓程式取得必要的亂數進行相關計算 。 ▪ 其實電腦只是個機器 , 它並不像人真的可以隨便亂想 一個數字出來 , 所以 random() 其實是用特定的演算 法產生『 不規則』 的數字 , 並非真的亂數 , 因此也稱 之為『虛擬』 亂數 (pseudo random number) 。  以下的程式 , 就是用亂數方法來產生隨機樂透號碼的 程式 , 由此範例便可瞭解如何利用 random() 來產生
  • 81. 產 生亂數方法
  • 82. 產 生亂數方法
  • 83. 產 生亂數方法 1. 第 11 、 12 行取得使用者輸入 , 決定要產生的號 碼組數。 2. 第 14 〜 34 行的迴圈就是在產生指定組數的號碼 。 3. 第 16 〜 18 行建立一個整數陣列 lotto[], 並將
  • 84. 產 生亂數方法 4. 第 21 〜 31 行的 do/while 迴圈進行產生 6 個隨 機數字的動作。因為程式可能產生重複的號碼 , 但 這是不允許的 , 所以不確定迴圈會執行幾次 , 故以 do/while 迴圈來執行。 5. 第 22 行呼叫 Math.random() 方法產生 0 至 48 間的亂數。
  • 85. 產 生亂數方法 6. 第 24 〜 30 行的 if/else 是用來判斷產生的數字是 否重複。每產生一新亂數時 , 就取出對應的 lotto[] 陣列元素值 , 並將該元素值設為 0, 下次若又產生 同一數字時 , 就會發現該元素值為 0, 因此就會執 行第 28 行的 continue 敘述 , 重新執行迴圈產生 另一個亂數。 7. 第 29 行每產生一個數字 , 就將 count 加 1, 當 31 行的 while 檢查 count 不小於 6, 表示已產生 6 個數字了 , 就不再執行迴圈。
  • 86. 17-4 日期、數字、貨幣的應用與國際化  在程式中經常會使用到日期、時間資料 , 除了取得目 前的日期、時間外 , 有時也會換算為星期幾、加減幾 天、或減幾個月 . . . 等。  而在輸入或輸出各類日期、數字、貨幣資料時 , 又往 往會因不同的國別、語系而有不同的格式。  這些在 Java API 中都有完善的支援 , 底下我們就一 一介紹。
  • 87. 17-4-1 Date 與 Calendar 類別的應用  java.util.Date 可用來儲存單一的日期與時間 , 而 java.util.Calendar 則像是萬用月曆 , 可進行各種日 期設定、轉換、加減等操作。  這二個類別的常用方法如下:
  • 88. Date 與 Calendar 類別的應用
  • 89. Date 與 Calendar 類別的應用 ▪ 以上所指的欄位 , 可以是 YEAR 、 MONTH 、 DAY_OF_MONTH( 日 ) 、 HOUR_OF_DAY( 時 ) 、 MINUTE 、 SECOND 、 DAY_OF_WEEK( 週 ) 等 , 這些都是在 Calendar 中所定義的靜態具名常數。 ▪ Calendar 的 set() 也可直接指定年月日等資料 , 包括 set( 年 , 月 , 日 ) 、 set( 年 , 月 , 日 , 小時 (24), 分 ) 、 及 set( 年 , 月 , 日 , 時 , 分 , 秒 ), 其中的參數均為 int 。 ▪ 代表月份的數值是由 0 開始 , 所以一月是 0, 二月是 1... ;而代表星期的數值 , 則星期日為 1, 星期一為 2..., 以此類推。
  • 90. Date 與 Calendar 類別的應用  請注意 , 由於 Calendar 為抽象類別 , 所以在建立 Calendar 時不可直接用 new 來建構 , 而必須呼叫其 靜態方法 Calendar.getInstance(), 來動態建立並傳 回一個 Calendar 的子物件。  其原因主要是因為不同語系在處理日期時間時可能會 有一些差異 , 因此 Java 會針對這些差異來建立不同 的 Calendar 子類別。有關語系的部份我們稍後會介 紹。
  • 91. Date 與 Calendar 類別的應用  另外 , 月曆的 add() 和 roll() 都可針對指定欄位 ( 例如月、日、或分 ) 來加減數值 , 而二者的差異是 roll() 不會進位 , 例如將月曆的日期加 12 個月後 , 使用 add() 時年份會加 1, 而使用 roll() 則年份不 變。  底下來看範例。
  • 92. Date 與 Calendar 類別的應用
  • 93. Date 與 Calendar 類別的應用 1. 第 6 行在印出 d 時 , 由於需轉為字串 , 因此會自 動呼叫其 toString() 方法。
  • 94. Date 與 Calendar 類別的應用 2. 第 11 、 13 行的 DAY_OF_WEEK 、 MONTH 都 是 Calendar 的公開靜態常數 , 因此透過物件 (c) 或類別名稱 Calendar 來存取都可以。在讀取星期 幾時 , 會傳回代表星期的數值 ( 星期日為 1, 星期 一為 2...), 所以要減 1 才行。但如果是讀取月份 , 例如 c.get(c.MONTH), 則要加 1 ( 因為一月是 0) 。 3. 第 14 行 getTime() 會傳回 Date 物件 , 並自動呼 叫其 toString() 方法將內容轉為字串。
  • 95. Date 的另 一種用法  Date 物件中其實是儲存著一個 long 的變數 , 代表 距 1970/1/1 凌晨以後多少毫秒 ( 千分之一秒 ) 的日 期 / 時間。因此我們也可以使用以下方法來操作: ▪ 這些方法雖然很少用到 , 但偶而會出現在 SCJP 考題 中 , 所以還是稍微了解一下比較好。
  • 96. 17-4-2 國際化的 Locale 類別  java.util.Locale 類別可用來建立代表特定國別語系的 物件 , 以便搭配稍後會介紹的 java.text.DateFormat 、 java.text.NumberFormat 等 格式化的類別 , 來輸出 / 輸入特定語系的日期、數值 、貨幣等資料。  以下是 Locale 的建構方法:
  • 97. 國際化的 Locale 類別  其中的參數 language 為『 ISO 語言碼』 , 例如中 文為 "zh" ;而 country 則為『 ISO 國家碼』 , 例 如台灣為 "TW" 。  另外 , Locale 中也定義了一組代表國家、語系的靜 態常數 , 例如 Locale.TRADITIONAL_CHINESE 代 表繁體中文語系 , 而 Locale.TAIWAN 則代表台灣。  若要查詢 Locale 物件所代表的語系或國家 , 則可使 用 getDisplayLanguage() 或 getDisplayCountry() 方法。
  • 98. 國際化的 Locale 類別  這二個方法也可在參數中指定要使用哪種語言來輸出 查詢結果 , 底下是範例:
  • 99. 國際化的 Locale 類別
  • 100. 17-4-3 格式化日期的 DateFormat 類別  當我們要輸出 ( 入 ) 特定樣式或語系的日期字串時 , 就可使用 java.text.DateFormat 類別。  DateFormat 也是一個抽象類別 , 同樣要使用靜態方 法來建立其子物件:
  • 101. 格式化日期的 DateFormat 類別  其中第 2 、 3 個方法的參數也可以省略 , 但須由最 後的參數開始往前省略。省略的參數即使用預設值 (SHORT 樣式及系統語系 ) 。  常用的樣式有 SHORT( 短 ) 、 MEDIUM( 中 ) 、 LONG( 長 ) 、 FUL L( 完整 ) 等。  要將日期格式化為字串時 , 可使用 format() 方法; 若要解析特定格式的日期字串 , 則可使用 parse(St r ing s ) 方法 , 但如果格式不對 , 則會丟出 ParseException 的例外 , 此例外要在程式中捕捉
  • 102. 格式化日期的 DateFormat 類別  底下來看範例:
  • 103. 格式化日期的 DateFormat 類別
  • 104. 格式化日期的 DateFormat 類別  請注意 , 我們在第 3 行靜態匯入了 DateFormat 的 所有靜態成員 , 因此可在程式中直接使用其靜態的方 法及變數 , 而不用加上類別名稱 ( 例如第 8 、 11 行)。
  • 105. 17-4- 4 格式化數值 與貨幣的 NumberFormat 類 別  相對於前面介紹的 java.text.DateFormat 類別 , java.text.NumberFormat 類別則是專門用來輸出 ( 入 ) 特定格式的數值與貨幣。  同樣的 , NumberFormat 也是一個抽象類別 , 要使用 靜態方法來建立其子物件:
  • 106. 格式化數值 與貨幣的 NumberFormat 類別  此類別除了提供前面已介紹過的 format() 及 parse() 方法外 , 常用的還有:讀取、設定最大小數位數的 getMaximumFractionDigits( ) 、 setMaximumFractio nDigits(int i), 最少小數位數的 getMinimumFractionDigits() 、 setMinimumFraction Digits(int i), 以及設定只解析整數部份的 setParseIntegerOnly(boolean b) 等方法。  底下是範例。
  • 107. 格式化數值 與貨幣的 NumberFormat 類別
  • 108. 格式化數值 與貨幣的 NumberFormat 類別
  • 109. 格式化數值 與貨幣的 NumberFormat 類別
  • 110. 格式化數值 與貨幣的 NumberFormat 類別 1. 在第 3 、 4 行靜態匯入了 Locale 及 NumberFormat 的所有靜態成員 , 因此可在程式中 直接使用其靜態的方法或變數 ( 例如第 8 、 12 行)。 2. 第 23 行設定 nf 物件只解析整數部份 , 然後在第 25 行解析一個數值字串。不過請注意 , 在執行 parse() 時要處理 ParseException 例外 , 否則會 編譯錯誤。
  • 111. 17-5 使用 Regex 來搜尋與分解字串  在第 10 章已介紹過規則表示法 (Regular Expression, 簡稱 regex), 並可用在 String 的幾個 方法上:
  • 112. 使用 Regex 來搜尋與分解字串  以上這些還只是較陽春的功能 , 為了讓我們更方便、 更有效率地搜尋或分解文字 , Java 另外提供了 3 個 實用的類別:
  • 113. 17-5-1 搜尋字串的 Pattern 與 Matcher 類 別  如果想用迴圈來一一找出字串中符合 regex 的部份 , 那麼使用 java.util.regex.Pattern 及 java.util.regex.Matcher 來搜尋是最方便而有效率的 了。底下就來看範例:
  • 114. 搜尋字串的 Pattern 與 Matcher 類別
  • 115. 搜尋字串的 Pattern 與 Matcher 類別 1. 第 5 行用靜態方法 Pattern.compile() 來編譯 regex ( 第一個命令列參數 ) 並傳回 Patern 物件 , 在第 7 行則用此物件的 matcher() 方法 , 來傳回 可搜尋第二個命令列參數的 Matcher 物件。 2. 第 9 行呼叫 Matcher 物件的 find() 方法以尋找下 一個符合 regex 的子字串 , 該方法會傳回是否找到 的布林值。第 10 行的 start() 會傳回找到的位置 ( 由 0 算起 ), end() 傳回找到字串之後的下一個位 置 , 而 group() 則傳回找到的字串內容。
  • 116. 搜尋字串的 Pattern 與 Matcher 類別 3. 本例是尋找第一字為數字 (d), 且第二字為英數字 或底線 (w) 的字串。 有一點要注意 , 就是找過的字元就不會再找了 , 例 如第二次找到 12 之後 , 接著會由 3 開始找起 , 而不是由 2 開始找起。
  • 117. regex 中使用量詞的注意事項  在 regex 中若使用 ? 、 * 、 + 等限制次數的量詞 , 預設會找出最長的符合字串 , 例如用前面的程式來搜 尋以 b 結尾的任意字串:  程式會找出最長符合的字串 , 而不會找出較短的 "aab" 或 "b" 。如果希望由字串開頭 ( 由左往右 ) 找 出較短字串 , 則可在量詞後面多加一個 ? ( 即 ?? 、 *? 、 +?), 例如:
  • 118. regex 中使用量詞的注意事項  另外 , 在使用 ? 或 * 時 , 0 長度的字串也會被搜尋 出來 , 例如:
  • 119. 17-5-2 分解字串的類別 Scanner  String 的 split() 只能將字串一次全部分解為陣列 , 而 java.util.Scanner 類別則提供了更豪華的功能: 1. 可用迴圈的方式來逐一分解字串 , 以便做進一步的處 理 , 或隨時中止迴圈。 2. 可由字串中解析指定型別的資料 , 例如 nextInt() 可 由字串中取出一個整數資料。 3. 可由檔案、鍵盤、字串等串流來建構 Scanner 物件 , 並做為解析的來源資料。
  • 120. 分解字串的類別 Scanner  Scanner 預設的分隔符號為連續空白 , 但我們也可 用 useDelimeter(String pattern) 來指定一個 regex 樣式做為分隔。  每次要讀取下一個片斷 (Token) 時 , 則可使用 next() 方法傳回片斷字串 , 或使用 nextXxx() 方法 (Xxx 表 Char 以外的基本型別 ) 讀取片斷並轉為指 定的型別。  而 hasNext() 及 hasNextXxx() 則可用來判斷是否 還有下一個字串 , 或還有可轉為 Xxx 型別的資料片 斷。
  • 121. 分解字串的類別 Scanner  底下範例以預設的連續空白為分隔 , 分別用解析字串 與解析資料型別的方式 , 來解析命令列傳入的參數:
  • 122. 分解字串的類別 Scanner
  • 123. 分解字串的類別 Scanner
  • 124.  17-A 求任意次方根
  • 125. 1. Given: What is the result? A. short, Long B. Short, Long C. Short, Short D. Compilation fails. E. An exception is thrown at runtime..
  • 126. 2. What is the result of following program? A. int D. Compilation fails. B. short C. Short E. An exception is thrown at runtime.
  • 127. 3. Please place the correct Answers to the Output empty boxes.
  • 128. 4. What 's the result of following Code? A. B. C. D. E. 3 3.141593 %d Compilation fails. An Exception is thrown at runtime.
  • 129. 5. What will be the result if current day is 2009/10/31? A. 31-Dec-2009 B. Dec 31, 2009 D. Compile fails at line 8. E. Compile fails at line 6 and 8. F. An exception is thrown at runtime. C. 31/12/09
  • 130. 6. What is the result? (Choose two.) A. s1 = 3 B. s1 = 3.142 C. s1 = 3.141593 D. s2 = 5 E. s2 = 5.0 F. s2 = 5.00
  • 131. 7. What is the result of following code? A. 3 B. 8 C. 0 D. Compilation fails. E. An exception is thrown at runtime.
  • 132. 7. Given: Which codes, insert at line 7, will get the default country name and current date?
  • 133. A. A .Locale loc = Locale.getDefault(); String s = loc.getDisplayCountry() + f.setFormat(d); B. B. Locale loc = Locale.getDefault(); String s = loc.getDisplayCountry() + f.format(d); C. C. Locale loc = Locale.getLocale(); String s = loc.getDisplayCountry() + f.setFormat(d); D. D. Locale loc = Locale.getLocale(); String s = loc.getDisplayCountry() + f.format(d);