1 / 63

第九章 Package 包裹與 Jar 檔案

第九章 Package 包裹與 Jar 檔案. 課前指引

finley
Download Presentation

第九章 Package 包裹與 Jar 檔案

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九章 Package包裹與 Jar檔案 課前指引 當Java程式編輯完成後,執行程式編譯,編譯完成後,我們將發現程式中的每一類別都各自譯成一個xxx.class檔。如果一個目錄內有兩個檔案,編譯後將各自產生許多class檔,散落間插各處,分不清那個class檔是屬於那一檔案,不易管理亦不易儲存。Java於程式設計時,可依需要設定package包裹,將一個Java程式、或多個功能相同的Java程式,歸置於一個包裹內,同一包裹內的類別在編譯完成後,歸置於同一目錄內,如此既易管理亦易儲存。為了增加可攜性,Java更可將package包裹壓縮成jar檔案,因jar檔案本身就是眾多class檔的集合,故可立即用於執行。

  2. 章節大綱 9-1 簡介 9-6 壓縮檔案 9-2 類別檔案 9-7 jar檔與class檔之加入 9-3 單一檔案包裹 9-8 使用jar檔 9-4 多檔案包裹 9-9 SCJP常考關鍵 9-5 包裹匯入 備註:可依進度點選小節

  3. 9-1 簡介 • 當Java程式編輯完成後,執行程式編譯,編譯完成後,我們將發現程式中的每一類別都各自譯成一個xxx.class檔。如果一個目錄內有兩個檔案,編譯後將各自產生許多class檔,散落間插各處,分不清那個class檔是屬於那一檔案,不易管理亦不易儲存。

  4. 9-1 簡介 • Java於程式設計時,可依需要設定package包裹,將一個Java程式、或多個功能相同的Java程式,歸置於一個包裹內,同一包裹內的類別在編譯完成後,歸置於同一目錄內,如此既易管理亦易儲存。 • 為了增加可攜性,Java更可將package包裹壓縮成jar檔案,因jar檔案本身就是眾多class檔的集合,故可立即用於執行。

  5. 9-2 類別檔案 • 當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案,如前述,如此每一個class檔案就是一個物件。 • 在Java程式檔案諸多class類別中,僅允許其中具有代表性的主體類別前置 “public”,用於爾後置入包裹之後,可讓其他程式取用此包裹。

  6. 9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 01 public class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_1 {

  7. 9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 12 public static void main(String[] args) { 13 E a = new E(); 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber,前置public。 列10 為類別class E。 列11~17 為類別class Ex9_1,前置public。 討論事項: 在Java程式檔案諸多class類別中,僅允許其中主體類別可前置public。本例列01之class MyNumber與列11之class Ex9_1都前置public,將發生編譯錯誤。

  8. 9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 編譯錯誤:

  9. 9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 01 class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_2 { 12 public static void main(String[] args) { 13 E a = new E();

  10. 9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber。 列10 為類別class E。 列11~17 為類別public class Ex9_2,也是程式中唯一前置public之類別。

  11. 9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 程式編譯與執行: 鍵入javac Ex9_2.java編譯之,產生Ex9_2.class、MyNumber.class、E.class等檔案。 鍵入java Ex9_2 執行之。

  12. 9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 討論事項: (1) 當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案,如前述,如此之每一個class檔案就是一個物件。本例產生E.class、Ex9_2.class、MyNumber.class三個類別檔案。 (2) 本例程式執行結果為 a= 5。

  13. 9-3 單一檔案包裹 • (1) 檢視檔案內之類別程序,只允許其中一個可前置修飾子public,否則將發生編譯錯誤。 • (2) 於程式檔案內的第一列鍵入 “package yyy” 即完成設定,其中yyy為包裹名稱。

  14. 9-3 單一檔案包裹 • (3) 執行程式編譯時,於Dos視窗鍵入 “javac -d . zzz.java”,其中 “-d ” 為建立目錄、句點 “.” 為指向目前程式檔所在之目錄、“zzz.java” 為程式檔名稱。 • (4) 編譯完成後,將產生目錄yyy,該程式檔案產生的所有class檔,均自動歸納入目錄yyy內。於Dos視窗鍵入 “java yyy/zzz” 執行之,其中zzz為主體類別。

  15. 9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {}

  16. 9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 12 public class Ex9_3 { 13 public static void main(String[] args) { 14 E a = new E(); 15 a.setNumber(5); 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 package為關鍵字,myPackage為包裹名稱。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~18 為類別public class Ex9_3,也是程式中唯一前置public之類別。 編輯包裹: 於程式檔案內的第一列鍵入 “package myPackage” 即完成設定,其中package為關鍵字,myPackage為包裹名稱。 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . Ex9_3.java編譯之,將產生目錄myPackage,各編譯完成之類別(class) 檔均放置於此目錄內。

  17. 9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 編輯包裹: 於程式檔案內的第一列鍵入 “package myPackage” 即完成設定, 其中package為關鍵字, myPackage為包裹名稱。 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . Ex9_3.java編譯之, 將產生目錄myPackage,各編譯完成 之類別(class) 檔均放置於此目錄內。

  18. 9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 執行包裹: 鍵入java myPackage/Ex9_3 執行之。(注意此處使用左斜線) 討論事項: 編譯時,我們鍵入javac -d . Ex9_3.java編譯之,其中句點 “.” 是指向當時之目錄,將包裹置於當時目錄。如果我們要將包裹置於其他目錄,則以其他目錄之位置取代句點,如javac -d c:\aa\bb Ex9_3.java,其中c:\aa\bb為其他目錄。

  19. 9-4 多檔案包裹 • (1) 檢視所有程式檔案內之類別程序,每一包裹最多只允許其中一個可前置修飾子public,否則將發生執行錯誤。(如果每一檔案有一public類別,雖可編譯,但有時無法執行) • (2) 於各程式檔案內的第一列鍵入相同之 “package yyy” 即完成設定,其中yyy為共同包裹名稱。

  20. 9-4 多檔案包裹 • (3) 執行程式編譯時,於Dos視窗鍵入 “javac –d . *.java”,其中 “-d ” 為建立目錄、句點 “.” 為指向目前程式檔所在之目錄、“*.java” 為各程式檔案。 • (4) 編譯完成後,將產生目錄yyy,該程式檔案產生的所有class檔,均自動歸納入目錄yyy內。於Dos視窗鍵入 “java yyy/zzz” 執行之,其中zzz為主體類別。

  21. 9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 檔案MyNumber.java: 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }

  22. 9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 檔案Ex9_4.java: 11 package myPackage; 12 class E extends MyNumber {} 13 public class Ex9_4 { 14 public static void main(String[] args) { 15 E a = new E(); 16 a.setNumber(5); 17 System.out.println("a=: "+a.getNumber()); 18 } 19 }

  23. 9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 列01~10 為檔案MyNumber.java。 列11~19 為檔案Ex9_4.java。 編輯包裹: 於各程式檔案內的第一列鍵入相同之 “package myPackage” 即完成設定,其中myPackage為共同包裹名稱。

  24. 9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . *.java編譯之, 將產生目錄myPackage,各編譯 完成之類別(class) 檔均放置於此 目錄內。

  25. 9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 執行包裹: 鍵入java myPackage/Ex9_4 執行之。

  26. 9-5 包裹匯入 • 包裹匯入之格式為import yyy.zzz,其中import為關鍵字,yyy為包裹名稱、zzz為包裹內之主體類別。 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 檔案MyNumber.java: 01 package myPackage; 02 public class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }

  27. 9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 列01 將檔案MyNumbdr.javar編譯在包裹myPackage內。 列02 本檔案之主體類別必須前置public,否則將無法被其他程式檔案使用。 建立包裹: 於Dos視窗鍵入 javac –d . MyNumber.java 編譯之,將產生目錄 myPackage,編譯完成之類別 (class) 檔放置於此目錄內。

  28. 9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 檔案Ex9_5.java: 01 import myPackage.MyNumber; 02 class E extends MyNumber {} 03 public class Ex9_5 { 04 public static void main(String[] args) { 05 E a = new E(); 06 a.setNumber(5); 07 System.out.println("a=: "+a.getNumber()); 08 } 09 }

  29. 9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 列01 以import myPackage.MyNumber將包裹匯入使用。 編譯與執行: 鍵入javac Ex9_5.java編譯之;鍵入java Ex9_5執行之。

  30. 9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {} 12 public class Ex9_6 { 13 public static void main(String[] args) { 14 E a = new E(); 15 a.setNumber(5);

  31. 9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 設定包裹package myPackage。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~17 為類別public class Ex9_6。 建立包裹: 於Dos視窗鍵入j avac –d . Ex9_6.java編譯之, 將產生包裹目錄myPackage, 編譯完成之類別(class) 檔放 置於此目錄內。

  32. 9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 建立jar檔: 鍵入jar cvf myJar.jar myPackage,壓縮包裹myPackage內之各class檔,建立jar檔myJar.jar。

  33. 9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 建立jar檔:

  34. 9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 執行jar檔: 鍵入java -classpath myJar.jar myPackage/Ex9_6,執行myJar.jar檔之主類別Ex9_6。

  35. 9-7 jar檔與class檔之加入 • jar檔是由多個壓縮之class檔所組成,前節內容是將包裹內的數個class檔,同時壓縮成一個jar檔。本節將介紹如何將一個class檔壓縮,加入jar檔? • 包裹class檔 • 包裹(Package) 是由多個有關係的class檔所組成,因此、我們通常以包裹為單元,將其中之class檔案壓縮成一個jar檔。

  36. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {} 12 public class Ex9_7 { 13 public static void main(String[] args) {

  37. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 14 E a = new E(); 15 a.setNumber(5); 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 設定包裹package myPackage。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~17 為類別public class Ex9_7。

  38. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 建立包裹: 於Dos視窗鍵入javac –d . Ex9_7.java編譯之,將產生包裹目錄myPackage,編譯完成之類別(class) 檔放置於此目錄內。

  39. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 建立jar檔: 鍵入jar cvf myJar.jar myPackage\Ex9_7.class,壓縮包裹內之Ex9_7.class檔,建立jar檔myJar.jar。(注意此處使用右斜線)

  40. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 其他class檔加入jar檔: 鍵入jar uvf myJar.jar myPackage\MyNumber.class,壓縮包裹內之MyNumber.class檔,加入jar檔myJar.jar。 鍵入jar uvf myJar.jar myPackage\E.class,壓縮包裹內之E.class檔,加入jar檔myJar.jar。

  41. 9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 執行jar檔: 鍵入java -classpath myJar.jar myPackage/Ex9_7,執行myJar.jar檔之主類別Ex9_7。

  42. 9-7 jar檔與class檔之加入 • 非包裹class檔 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 01 class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_8 { 12 public static void main(String[] args) { 13 E a = new E();

  43. 9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber。 列10 為類別class E。 列11~16 為類別public class Ex9_8。 建立class檔: 於Dos視窗鍵入 javac Ex9_8.java編譯之, 將產生Ex9_8.class、 MyNumber.class、E.class 等class檔。

  44. 9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 建立jar檔: 鍵入jar cvf myJar.jar Ex9_8.class,壓縮Ex9_8.class檔,建立jar檔myJar.jar。

  45. 9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 其他class檔加入jar檔: 鍵入jar uvf myJar.jar MyNumber.class,壓縮MyNumber.class檔,加入jar檔myJar.jar。 鍵入jar uvf myJar.jar E.class,壓縮E.class檔,加入jar檔myJar.jar。

  46. 9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 執行jar檔: 鍵入java -classpath myJar.jar Ex9_8,執行myJar.jar檔之主類別Ex9_8。

  47. 9-8 使用jar檔 • 我們已實作如何建立jar檔,讀者以後在Java程式設計上,將會開發jar檔提供給其他程式使用;或是讀者自己在設計程式時,使用到別人開發的jar檔。當設計提供其他程式使用的jar檔時,壓縮至jar檔之主類別必須前置 “public”,否則該jar檔無法被其他程式使用。在使用jar檔之設計上可分為:(1)使用匯入jar檔,(2)使用jar檔新物件。

  48. 9-8 使用jar檔 • 無論使用匯入jar檔、或使用jar檔新物件,為了方便管理,通常均以包裹(Package) 為單元,亦即以包裹的名稱為匯入名稱、或以包裹的名稱為原始物件的名稱。

  49. 9-8 使用jar檔 • 使用匯入jar檔 • 範例9_9:設有檔案Ex9_9.java與MyNumber.java,解釋匯入jar檔案之應用。 檔案MyNumber.java: 01 package myPackage; 02 public class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }

  50. 9-8 使用jar檔 • 範例9_9:設有檔案Ex9_9.java與MyNumber.java,解釋匯入jar檔案之應用。 列01 將檔案MyNumbdr.javar編譯在包裹myPackage內。 列02 本檔案之主體類別必須前置public,否則將無法被其他程式檔案使用。 建立包裹: 於Dos視窗鍵入 javac –d . MyNumber.java 編譯之,將產生目錄 myPackage,編譯完成之 類別(class) 檔放置於此目錄 內。

More Related