780 likes | 891 Vues
類別庫. 內 容 大 綱. 類別庫介紹 類別庫的建立 類別庫的使用 內建類別庫. 類別庫介紹 (1/4). 類別庫 (package) 就如同其名稱所顯示的,是存放類別的所在。它就如同是傳統語言的 函式庫 (library) 一樣,可以用來存放一些公用的程式及資料。 Java 語言的類別庫主要是用來儲存一些內建類別的位元組碼檔案 ( 附加檔名為 .class) 及一些與內建類別相關的資料檔案。使用者可以於程式中直接引用類別庫中的類別及資料,這可以避免重複撰寫相同的程式碼,以加速程式的開發。
E N D
內 容 大 綱 • 類別庫介紹 • 類別庫的建立 • 類別庫的使用 • 內建類別庫
類別庫介紹 (1/4) • 類別庫(package)就如同其名稱所顯示的,是存放類別的所在。它就如同是傳統語言的函式庫(library)一樣,可以用來存放一些公用的程式及資料。Java語言的類別庫主要是用來儲存一些內建類別的位元組碼檔案(附加檔名為 .class)及一些與內建類別相關的資料檔案。使用者可以於程式中直接引用類別庫中的類別及資料,這可以避免重複撰寫相同的程式碼,以加速程式的開發。 • Java語言中的每一個類別庫必須對應至檔案系統中一個同名子目錄,如同檔案系統一樣,類別庫也是採用階層式命名,而在每個不同階層的名稱之間使用句點(.)區隔開來。例如java.awt是一個二階層命名的類別庫,而這個類別庫的所有類別應存在於檔案系統中java子目錄之awt子目錄中(即java\awt子目錄)。
類別庫介紹 (2/4) • 類別庫對應至檔案系統中子目錄的作法可以方便的將相關的類別整理在一起,而不同的類別庫也都有各自的類別命名空間,這可以解決類別命名的同名衝突問題。另外,類別庫的建立也增加一種變數或方法存取控制的可能,我們將使用類別庫可達到的優點整理於下: • 使用類別庫(package)的優點: • 可將相關的類別及資料整理在一起。 • 多一種類別庫層次的存取控制【註解】。 • 避免類別命名時的同名衝突狀況。
類別庫介紹 (3/4) • 類別庫除了置放於與類別庫同名的子目錄中外,也可以使用壓縮的方式置放於附加檔名為.zip(gnzip格式)的檔案中或附加檔名為.jar(Java Archive格式)的檔案中,如此可以節省儲存空間並使檔案系統不至於太複雜。Java語言的內建類別庫就是利用附加檔名為.jar的Java Archive格式儲存的,在J2SDK中,整個Java的內建類別庫是存於j2sdk1.4.1_01\jre\lib\rt.jar檔案中,圖7-1是使用winzip解壓縮軟體查看rt.jar檔案的畫面,壓縮於rt.jar檔案中的是所有一般的Java語言內建類別的位元組碼檔案及其他相關資料檔案。
類別庫的建立 (1/6) • 建立類別庫的方式相當簡單,你只要在程式檔案除了註解以外的第一行使用以下的宣告: package某類別庫; • 上列宣告將整個檔案中的類別都指定為某類別庫的一部分了。一個檔案只能有一個類別庫宣告,而數個檔案可以宣告為屬於同一個類別庫。類別庫宣告會使檔案中的類別(或變數或方法)自動冠上類別庫名稱,例如,定義於類別庫某類別庫的類別甲會以 某類別庫.類別甲 的型式被存取,Java語言替類別(或變數或方法)自動冠上類別庫名稱的做法就是避免類別同名衝突的可能性。
類別庫的建立(2/6) • 建立類別庫除了在程式中使用package關鍵字作類別庫宣告之外,還要在檔案系統中產生相對應的目錄,並且將附加檔名是 .class的類別位元組碼檔案置放於對應的目錄中才算完成整個類別庫的建立動作,我們舉以下的例子加以說明: • 假設 /javafile是目前的工作目錄,而且我們要編譯以下檔案 //檔名: 類別甲.java //說明: 將「類別甲」定義於「某類別庫」中 package 某類別庫; public class 類別甲{ } • 則我們要在 /javafile目錄之下先產生某類別庫之目錄,並且將檔案類別甲.java 置放於其中,並且於某類別庫之目錄中執行編譯動作以產生類別甲.class的位元組碼檔案。
類別庫的建立(3/6) • Java程式於執行時或編譯時都是假設類別庫所在的目錄是建立於目前工作目錄之下,若我們都不改變工作目錄,則上列的做法已經可以完成類別庫的建立了,但是一旦我們改變工作目錄,則Java程式於執行時或編譯時會找不到類別庫所對應的目錄,此時我們必須將原先的工作目錄(在本例中為\javafile這個目錄)設定於作業系統環境變數CLASSPATH中,其作法為在命今視窗中的命令提示符號下執行以下命令 • SET CLASSPATH=%CLASSPATH%;\javafile • 上列指令使得java編譯器及解譯器知道要從 \javafile這個目錄開始去尋找類別庫所對應的目錄。讀者也可以將上列命令加入自動執行檔autoexec.bat中,以便每次開機時上列的環境變數CLASSPATH設定指令都可以自動執行。 提示 提示
類別庫的建立(4/6) • Java編譯器及解譯器於執行時會根據CLASSPATH參數中所設定的目錄依序尋找類別庫,例如,在上例中,若在javafile目錄中存在某類別庫子目錄而且其中存有位元組碼檔案類別甲.class,則某類別庫. 類別甲就可以被正確的找出。Java語言發展工具程式根據CLASSPATH參數除了尋找類別庫相對目錄之外,也會尋找附加檔名為.jar或.zip的檔案。如前所述,附加檔名為.jar或.zip的檔案是使用壓縮方式存放類別庫資料的檔案,壓縮在附加檔名為.jar或.zip的檔案中的類別庫都可以正確的被Java語言發展工具程式讀取。
類別庫的建立(5/6) • Java語言最常使用的類別庫資料壓縮檔案為附加檔名為.jar的Java Archive格式,讀者可以利用JDK所附的公用程式jar來執行檔案之壓縮與解壓縮工作,例如 jar cf 某類別庫.jar 類別甲.class 類別乙.class • 上列指令會將檔案類別甲.class與檔案類別乙.class壓縮於某類別庫.jar檔案中。
類別庫的建立(5/6) • 公用程式jar有許多不同的用法,讀者可在命令提式符號後輸入jar指令即可看到jar公用程式的所有用法說明,如圖7-2所示。 C:\j2sdk1.4.1_01\bin>jar 使用︰jar {ctxu}[vfm0Mi] [jar-file] [manifest-file] [-C dir] files ... 選項︰ -c 建立新的歸檔 -t 列出歸檔的目錄 -x 從歸檔擷取以命名的 (或全部) 檔案 -u 更新現有的歸檔 -v 在標準輸出中產生 verbose 輸出 -f 指定歸檔檔名 -m 包含來自指定 manifest 檔案的顯示資訊 -0 僅限儲存;使用非 ZIP 的壓縮方式 -M 不建立項目的 manifest 檔案 -i 為指定的 jar 檔案產生索引資訊 -C 變更為指定的目錄並包含下列檔案 如果任何檔案都是一個目錄的話,則會使用遞迴方式加以處理。 必須使用指定的 'm' 和 'f' 旗標相同順序, 指定 manifest 檔案名稱和歸檔檔名。 範例 1︰若要將兩個類別檔案保存在名稱為 classes.jar 的歸檔中︰ jar cvf classes.jar Foo.class Bar.class 範例 2︰使用現有的 manifest 檔案 'mymanifest',將 foo/ 目錄中的 所有檔案保存在 'classes.jar'︰ jar cvfm classes.jar mymanifest -C foo/ . C:\j2sdk1.4.1_01\bin> • 圖7-2. 公用程式jar的用法說明畫面。
類別庫的建立(6/6) • 一個小程式applet的執行,有時需要用的許多位元組碼檔(bytecode),影像檔及音效檔等,讀者可以使用jar公用程式這些檔案壓縮之後存成單一的jar檔案, 如此可以方便檔案的傳輸,例如: jar cf 檔案集.jar 類別甲.class 類別乙.class 影像.jpg 音效.wav • 上列指令可以將類別甲.class及類別乙.class等位元組碼檔案及影像.jpg之影像檔案及音效.wav之音效檔案壓縮至檔案集.jar中,而以下的HTML標籤內容: <APPLET CODE="類別甲.class" ARCHIVE="檔案集.jar" WIDTH="150" HEIGHT="150"> </APPLET> • 可以讓類別甲.class、類別乙.class、影像.jpg及音效.wav等四個檔案以壓縮方式由檔案集.jar檔案中傳進瀏覽器,並於自動解壓縮之後,載入類別位元組碼檔案類別甲.class於瀏覽器網頁中執行。
類別庫的使用 (1/3) • 一般我們要使用其他類別庫的類別可以使用以下二方法來達成: • 在類別名稱之前直接加上類別庫名稱,例如,我們用java.io.File 物件甲 = new java.io.File( );來宣告一個屬於java.io類別庫中File類別的物件物件甲,並以new運算子來產生物件個例並呼叫java.io類別庫中File類別的建構方法。 • 使用import關鍵字直接引入類別庫中的類別,例如,我們在程式最開頭的地方使用敘述import java.io.File;表示引入java.io類別庫之File類別之後,就可以省略類別庫名稱java.io而直接列出類別名稱File即可。於是java.io.File 物件甲 = new java.io.File( ); 就可以直接寫成較為簡捷的File 物件甲 = new File( );
類別庫的使用 (2/3) • 請注意,在使用import關鍵字時可以配合星號(*)來引入一整個類別庫的類別,我們將import關鍵字的用法整理如下: import某類別庫.某類別; • 上列敘述表示要引入類別庫某類別庫中的類別某類別。 import某類別庫.*;
類別庫的使用 (3/3) • 上列敘述表示要引入類別庫某類別庫中的所有類別。星號形式的import用法並非實際載入類別庫中的所有類別,而是在編譯時碰到實際的類別存取才會到import關鍵字後指定的類別庫中搜尋以載入適當的類別。 提示
內建類別庫(1/7) • Java語言有許多的內建類別,Java語言的內建類別一般稱為Java API(Java Applications Programming Interface),大部份的Java API都存放於以下的12個以「java.」開頭的類別庫中:java.applet、java.awt、java.beans、java.io、java.lang、java.math、java.net、java.rmi、java.security、java.sql、java.text、java.util,表7-1依照字母次序列出這上列12個類別庫的說明。
內建類別庫(2/7) • 上列12個類別庫中的java.lang類別庫是Java語言中最基本的類別庫,其中包含許多Java語言程式編譯或執行時必定要用到的類別,如System、String、Object等類別,這個類別庫中的類別於Java程式編譯或執行時會自動引入,我們稍後將會詳細的介紹這個類別庫。
內建類別庫(4/7) • 除了以上所列12個以「java.」開頭的類別庫外,我們再於表7-2中介紹javax.swing與org.omg.CORBA類別庫: 提示
內建類別庫(5/7) • Java語言內建類別庫中類別的數量實在太多了,而每個類別又定義了許許多多的方法。尤其是這些內建類別與方法經常有一些新的修正,而又常常有新定義出來的類別加入類別庫中。因此,我們建議讀者直接自網址http://java.sun.com中下載最新的API說明文件,以獲取最新的訊息。另外,讀者於撰寫程式時若能交叉著查詢API說明文件,將可達事半功倍的效果,請讀者一定要善用API說明文件。 • 與JDK版本J2SDK1.4.1_01配合的API說明文件檔案為j2sdk-1_4_1-doc.zip檔案,讀者可以自昇陽(Sun)公司網站或國內各大學網站下載此檔案並將之解壓縮後觀看其內容。Java語言API說明文件是以HTML格式呈現的,其顯示畫面如圖7-3所示。
內建類別庫(7/7) • 如上所述,java.lang類別庫中存放許多Java程式執行所需要用到的類別與介面,而且Java程式在編譯或在執行時會自動引入這個類別庫,由此可見這個類別庫的重要性,以下我們就詳細的介紹java.lang類別庫中比較重要的類別,如String、Math、System、Double、Long及Character等類別。 提示
String類別 (1/9) • 在第3章中已經介紹過String類別了,在這裡我們將介紹String類別的完整功能,以下所列是String類別建構方法的摘要說明:
String類別 (2/9) • 我們舉以下的例子來說明String類別建構方法的各種用法: char[] 字元陣列1={’a’,’b’,’c’}; String 字串1=new String(字元陣列1); char[] 字元陣列2={’0’,’1’,’2’,’3’,’a’,’b’,’c’,’7’,’8’}; String 字串2=new String(字元陣列2, 4, 3); byte[] 位元組陣列1={97,98,99}; //字元’a’的編碼為97,餘類推 String 字串3=new String(位元組陣列1); byte[] 位元組陣列2={48,49,50,51,97,98,99,55,56}; //字元’0’的編碼為48,餘類推 String 字串4=new String(位元組陣列2,3,4); String 字串5=new String(字串1); String 字串6=”abc”; • 上列的程式碼中所有的String類別的物件字串1、…、字串6的內容都相同,全部都是"abc"。
String類別 (3/9) • 以下我們介紹String類別常用的方法。
String類別 (5/9) • 我們使用以下的範例程式綜合說明String類別各個方法的用法: 範例程式(檔名: 字串測試.java) //檔名:字串測試.java //說明:一個說明String類別各個方法用法的範例 class字串測試 { public static void main(String[] 參數) { String 字串1="床前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。"; System.out.println("字串1之內容: "+字串1); System.out.println("字串1之長度: "+字串1.length()); int i=0,j=4;
String類別 (6/9) System.out.println("字串1索引位置為"+i+"的字元: "+字串1.charAt(i)); System.out.println("字串1索引位置為"+j+"的字元: "+字串1.charAt(j)); String 字串2="abc",字串3="abd",字串4="ABC"; System.out.println("字串2與字串3相比較之值: "+字串2.compareTo(字串3)); System.out.println("字串2與字串3是否相同: "+字串2.equals(字串3)); System.out.println("字串2與字串4是否相同(忽略大小寫): "+字串2.equalsIgnoreCase(字串4));
String類別 (7/9) System.out.println("字串1是否以 思故鄉。 結束: "+字串1.endsWith("思故鄉。")); System.out.println("字串1是否以 床前 開頭: "+字串1.startsWith("床前")); System.out.println(" 明月 在字串1第一次出現的索引位置: "+字串1.indexOf("明月")); System.out.println(" 明月 在字串1最後一次出現的索引位置: "+字串1.lastIndexOf("明月")); System.out.println("字串1中的字元 月 取代為字元 日 的結果:\n "+字串1.replace(’月’,’日’)); System.out.println("字串1由索引位置6開始的部分字串: "+字串1.substring(6));
String類別 (8/9) System.out.println("字串1由索引位置6開始以索引位置11結束的部分字串: "+字串1.substring(6,11)); int 整數=1; float 浮點數=2.0000f; char 字元=’3’; boolean 布林=false; String 字串5=String.valueOf(整數)+ String.valueOf(浮點數)+ String.valueOf(字元) + String.valueOf(布林); System.out.println(字串5); } //方法:main() 定義區塊結束 } //類別:字串測試 定義區塊結束
String類別 (9/9) • 執行結果(命令視窗指令:java Run 字串測試)
Math類別 (1/7) • 以下是Math類別的說明:
Math類別 (4/7) • 我們使用以下的範例程式綜合說明Math類別各個方法的用法: • 範例程式(檔名: 數學函數測試.java) • //檔名: 數學函數測試.java • //說明:一個說明Math類別各個方法的範例 • class 數學函數測試 { • public static void main(String[] 參數) { • double 弳度=Math.random()*2*Math.PI; //使弳度介於0於2之間 • System.out.println("弳度之值: "+弳度); • System.out.println("相對角度之值: "+Math.toDegrees(弳度)); • System.out.println("sin("+弳度+")之值: "+Math.sin(弳度)); • System.out.println("cos("+弳度+")之值: "+Math.cos(弳度)); • System.out.println("tan("+弳度+")之值: "+Math.tan(弳度)); • double 數值=Math.random();
Math類別 (5/7) • System.out.println("數值之值: "+數值); • System.out.println("asin("+數值+")之值: "+Math.asin(數值)); • System.out.println("acos("+數值+")之值: "+Math.acos(數值)); • System.out.println("atan("+數值+")之值: "+Math.atan(數值)); • 數值=Math.random()*100; • System.out.println("數值之值: "+數值); • System.out.println("ceil("+數值+")之值: "+Math.ceil(數值)); • System.out.println("floor("+數值+")之值: "+Math.floor(數值)); • System.out.println("round("+數值+")之值: "+Math.round(數值)); • System.out.println("rint("+數值+")之值: "+Math.rint(數值));
Math類別 (6/7) • System.out.println("log("+數值+")之值: "+Math.log(數值)); • System.out.println("exp("+數值+")之值: "+Math.exp(數值)); • System.out.println("sqrt("+數值+")之值: "+Math.sqrt(數值)); • double 基底=Math.random()*100; • double 次方=Math.random()*100; • System.out.println("基底之值: "+基底); • System.out.println("次方之值: "+次方); • System.out.println("pow("+基底+","+次方+")之值: "+Math.pow(基底,次方)); • } //方法:main() 定義區塊結束 • } //類別: 數學函數測試 定義區塊結束
Math類別 (7/7) • 執行結果(命令視窗指令:java Run數學函數測試)
System類別 (1/6) • 以下是System類別的說明:
System類別 (3/6) • 我們使用以下的範例程式綜合說明System類別各個方法的用法: 範例程式(檔名: 類別System測試.java) • //檔名: 類別System測試.java • //說明:一個說明System類別各個方法的範例 • class 類別System測試 { • public static void main(String[] 參數) { • System.out.println(System.getProperties()); • System.out.println("java.class.path="+ System.getProperty("java.class.path"));
System類別 (4/6) • System.setProperty("java.class.path","test"); • System.out.println("java.class.path="+ System.getProperty("java.class.path")); • char[] 字元陣列1={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’}; • char[] 字元陣列2=new char[20]; • System.out.println("字元陣列2複製前內容"+new String(字元陣列2)); • System.out.println("陣列複製前時間: "+System. currentTimeMillis()); • System.arraycopy(字元陣列1,0,字元陣列2,5,10); //執行陣列複製 • System.out.println("複製陣列後時間: "+System. currentTimeMillis()); • System.out.println("字元陣列2複製後內容"+new String(字元陣列2)); • } //方法:main() 定義區塊結束 • } //類別: 類別System測試 定義區塊結束
System類別 (5/6) • 執行結果(命令視窗指令:java Run 類別System測試)
System類別 (6/6) • 第5行敘述中的 System.getProperties()的方法呼叫會列出所有的系統資訊項目,如範例7-3的執行結果中所示。系統資訊中比較重要的項目如下表所列:
我們在第三章中提過Java語言有八種基本型別byte、short、char、int、long、float、double、boolean。這八種型別加上void傳回型別都有有相對應的類別,這些對應的類別稱為包裝類別(wrapper class)。包裝類別使得Java語言可以將一切的事物都以物件來表示,以下我們介紹Java語言的包裝類別。
Double與Float類別 (1/9) • Double類別是double型別的包裝類別,而Float類別是float型別的包裝類別。因為Double類別與Float類別的用法非常接近,因此以下我們僅針對Double類別的用法加以說明, Float類別的用法則請讀者參考Java語言的API說明文件。
Double與Float類別 (2/9) • 以下是Double類別定義的常數:
Double與Float類別 (3/9) • 以下是Double類別建構方法的摘要:
Double與Float類別 (4/9) • 以下是Double類別常用方法摘要: