140 likes | 294 Views
基礎的工具類別. 井民全 http://debut.cis.nctu.edu.tw/~ching. 數學工具. Java 直接提供 整數 與 浮點數 的運算 高層次的運算由 java.lang.Math 類別提供 Java 為基本資料型態提供 包裹器類別 把基本類別視為物件 java.util.Random 類別可提供亂數的功能. 整數運算發生錯誤 : 由 ArithmeticException 來處理. int zero = 0; tr y { int i= 72 / zero ;
E N D
基礎的工具類別 井民全 http://debut.cis.nctu.edu.tw/~ching
數學工具 • Java 直接提供整數與浮點數的運算 • 高層次的運算由java.lang.Math類別提供 • Java 為基本資料型態提供包裹器類別 把基本類別視為物件 • java.util.Random類別可提供亂數的功能 整數運算發生錯誤: 由 ArithmeticException來處理 int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // 被 0 除 } 若公然的除 0, 編譯器會警告我們
數學工具: 浮點數不會丟出例外 • 以超出範圍的特殊值代替 • Nan • 表示其結果為 not a number • 不等於自己, 故 Double.Nan != Double.Nan 結果為 true • 如何判斷 Nan • Float.isNaN( ) ; Double.isNaN( ) double zero = 0.0 ; double d = 1.0 / zero ; if( d == Double.POSITIVE_INFINITY ) System.out.println( “發生除 0 狀況”) ; 會產生無限大的例子
數學工具: java.lang.Math類別 • 數學函式庫且所有的method 都是靜態,所以可以直接使用,無須宣告一個Math物件 Math.E 自然對數 (2.71828 …) Math.PI 圓週率 (3.14159…)
注意: log(), pow(), sqrt() 發生錯誤時, 會丟出 ArithmetricException 範例: double irrational=Math.sqrt(2.0); int bigger=Math.max(3,4); long one=Math.round(1.125789);
數學工具: java.math套件 • 若 long 和 double 還不夠長的話, java.math 套件提供了兩個類別 BigInteger與 BigDecimal • 它們支援任意精確度 try{ BigDecimal twentyone=new BigDecimal(“21”) ; BigDecimal seven = new BigDecimal(“7”) ; BigDecimal sum = twentyone.add(seven) ; int answer = sum.intValue( ); } catch ( NumberFormatException nfe) { } catch ( ArithmeticException ae) { }
取代環境變數的類別 java.util.Properties • 專門為了字串而有的 hash table • 可用來保存任何應用程式的組態資訊 • 可以下載或儲存串流 取出值: getProperty( ) 加入 String 的 Key / Value pair String xsize=props.getProperty(“myApp.xsize”); Properties props = new Properties(); props.put(“myApp.xsize”,”52”); props.put(“myApp.ysize”,”79”); 取出所有的Properties: propertyNames( ) for(Enumeration e=props.propertyNames(); e.hasMoreElements();) { String Name=e.nextElement(): … } 若指定的 property 不存在, getProperty() 會傳回 null 值
當找不到key時, 使用預設值 • 利用預設表設定預設值 Properties 預設表; … Properties props=new Properties(預設表); • 利用 getProperty() 方法, 指定預設值 String xsize=props.getProperty(“myApp.xsize”,”50”); 預設值
將 Properties 存到檔案 • 利用 store() method 可將資料存到 OutputStream 中 • 資訊以 ASCII 格式輸出 • 輸出到螢幕 props.store(System.out , “標頭: Application Parameters”); • 輸出到檔案 FileOutStream out=new FileOutStream(“屬性檔.txt”); props.store(out , “標頭: Application Parameters”); Jdk1.2以後 save 改由 store 輸出的結果 #標頭: Application Parameters #Mon Feb 12 09:24:23 CST1999 myApp.ysize=79 myApp.xsize=52
由檔案載入properties • 利用 load() 從 InputStream 讀取資料 FileInputStream fin=new FileInputStream(屬性檔.txt”); … Properties props=new Properties(); props.load( fin );
System property • Java.lang.System 提供靜態的 System.getProperty()傳回環境變數
設定系統參數 Applet 會避免讀取下列 properties: java.home; java.class.path; user.name; user.home; user.dir • 你的程式可以用 System.setProperty()設定參數 • 當你執行 java 直譯器時, 可使用 –D C:> java –Dfoo=bar -Dcat=Boojum MyApp • 便利方法 Boolean , Integer, Long, Color都有 get 方法用來查詢系統參數 Ex: Integer.getInteger(“foo”); // 找尋系統中叫做 foo 的參數值 Color.getColor(“foo”); // 將參數轉成 Color 物件 類別名稱
觀察者與被觀察者 • java.util.Observer 介面 (觀察者) • java.util.Observable 類別 (被觀察者) 當物件或資源 (被觀察者)改變時, 必須設法通知 用戶端物件(觀察者) 基本想法: 1. 被觀察者(Observable) 有個方法可以提供註冊 2. 想要觀察它的物件(Observer) 都呼叫該方法進行註冊 3. 當改變發生時, Observable 一個一個通知註冊的成員 (利用 呼叫成員的 update () method)
佈告欄(MessageBoard) 延伸 Observable(被觀察者) • 繼承 • 註冊 method addObserver() • 發布消息 method notifyObserver() public String getMessage(){ return message; } import java.util.*; public class MessageBoard extends Observable { } public void changeMessage(String Message){ this.message=message; setChanged(); notifyObservers(message); } public void static main(String []args){ MessageBoard board = new MessageBoard(); Student bob= new Student(); Student joe = new Student(); board.addObserver(bob); board.addObserver(joe); board.changeMessage(“出作業了”); } 註冊 class Student implements Observer { public void update(Obserable o, Object arg) { System.out.println(“版面改變了”+ arg ); } } 發佈消息