180 likes | 321 Views
Packages : Organizing Related Classes into Packages. 為了促使程式碼重用 (code reuse), 並有助於組成 classes, Java 提供一個強而有力的工具,將相關的 class 和 interface 收集在一個 directory (目錄) 內,稱之為 packages . 要建立一個 package (即,加 class 到某一個 package),只要在你 的 source code file 的第一行(任何 class 宣告之前)使用以下的 statement :
E N D
Packages : Organizing Related Classes into Packages • 為了促使程式碼重用 (code reuse), 並有助於組成 classes, Java 提供一個強而有力的工具,將相關的 class 和 interface 收集在一個directory (目錄) 內,稱之為 packages . • 要建立一個 package (即,加 class 到某一個 package),只要在你 的 source code file 的第一行(任何 class 宣告之前)使用以下的 statement : • package PackageName; • //而且這些class 都會存在名為 PackageName 目錄下。 • 有 package statement 的 source file 內的每一個 class 都被認為是該 package 的一部份。
套件 (Package) 的編譯與執行 • 「套件 (package)」 概念的主要用途就是用來將類別做分類管理,並且讓類別的使用能夠更方便。 • 定義及編譯套件 • 如果要定義套件,我們可以使用以下語法 • 套件的定義敘述句必需置放於程式中非註解的第一行。 • 程式中不可以有一行以上的「package」敘述句。 package packagename;
package • package的引用: import java.util.Arrays; 其中「java.util」就是package名稱。 • 自訂package: 要在類別最上方撰寫: package 套件名稱; 這樣就可以自訂套件了。 • Java中的package採用目錄表示法,也就是說如果您的package名稱是MyPackage,那麼您這個類別就會將自訂的 *.class放在MyPackage目錄下。
Java 使用 file system directories (檔案系統目錄) 來儲存 package • 同一個程式下的不同 class 可以分開儲存在同一目錄下的不同檔案中。不同 class可以分別compile ,然後執行有main()的class既可。系統自然會去連結同一目錄下的其他的 class • 不同的檔案可以包含相同的 package statement, 你可以建立一個 package 的階層,只要使用 "." , 來與它的上層 package name 隔開。多層 package statement 的一般型式如下: package pkg1[.pkg2] [.pkg3] ; Ex: import java.util.Arrays;
package pack2; • class Rectangle // 請參考第八章 • { . • . • . • } • public class TestRectangle // 同一java檔案中的class,只能有一個是public. • { public static void main(String args[]) • { . • . • } • } 編譯與執行步驟: 1.若TestRectangle.java 位於 work\pack2目錄, 執行 (javac pack2\TestRectangle.java ) 之後會自動在 work\pack2 目錄下產生 Rectangle.class, TestRectangle.class兩個檔案. 2.可位於 work目錄,執行 java pack2.TestRectangle. 3.若以上的兩個類別分開儲存成 pack2\Rectangle.java, pack2\TestRectangle.java (檔案中之第一行已經加入package pack2;),經分開編譯之後,亦可以上列的格式執行 .
//若TestRectangle.java 位於 work\pack4a目錄, 執行 (javac pack4a\TestRectangle.java ) //之後會自動在 work\pack4a 目錄下產生 TestRectangle.class package pack4a;public class TestRectangle // 將TestRectangle 納入package pack4a當中{ public static void main(String args[]) { pack4b.Rectangle r=new pack4b.Rectangle(); // 請參考第八章 TestRectangle.java //Rectangle.java 位於 work/pack4b目錄, 執行(javac pack4b\Rectangle.java ) 之後會自動在 work\pack4b 目錄下產生 Rectangle.class package pack4b; public class Rectangle { . // 請參考第八章 tRectangle.java . . } // Rectangle 要宣告成public才能被其他的package使用
//若Point.java 位於 \packA\subpackA目錄, 執行(javac \packA\subpackA\Point.java ) //之後會自動在 \packA\subpackA資料夾內產生 Point.class package packA.subpackA; public class Point { . . } //若Circle.java 位於 packA\subpackB目錄, 執行 (javac packA\subpackB\Circle.java )之後會自動在 packA\subpackB資料夾內產生 Circle.class package packA.subpackB; public class Circle { . . } //若TestPointCircle .java 位於 packA\目錄, 執行(javac Circle.java ) //之後會自動在 packA\資料夾內產生 TestPointCircle.class package packA; // 將 TestPointCircle類別納入package packA當中 import subpackA.Point; // 載入packA\subpacka裡的Point.class import subpackB.Circle; // 載入packA\subpackb裡的Circle.class public class TestPointCircle { . . }
Package 之階層關係 ..packA\subpackA\Point.java package packA.subpackA; ..packA\TestPointCircle.java package packA; ..packA\subpackB\Circle.java package packA.subpackB; C>javac packA\subpackA\Point.java C>javac packA\subpackB\Circle.java C> javac packA\TestPointCircle.java C>java packA.TestPointCircle
套件 (Package) 的編譯與執行… • package的名稱可以是一組有意義的文字,也可以是一連串以句號 ( . ) 組合而成的文字。 您可以將套件名稱中的句號 ( . ) 當做是Windows作業系統下的表示路徑的分隔符號 ( \ )。例如: • 預設的情況下,原始檔在編譯後,會在原始檔所在的目錄下產生「stock」資料夾,並在「stock」資料夾下再產生「sale」子資料夾,而編譯後的「Customer.class」檔案就會放在「sale」資料夾中。 package stock.sale; public class Customer {}
8-2 套件 (Package) 的編譯與執行… • Java程式中的每一個類別檔都一定是屬於某一個套件,位於同一個套件下的類別檔可以互相的引用。 • 對於沒有定義package敘述句的Java檔案,它們所產生的類別檔是置放於「預設套件 (default package)」中,也就是Java原始檔案所在的同一個目錄 (現行目錄) 下。
套件 (Package) 的編譯與執行… • 如果要在現行目錄下直接編譯具有package敘述句的Java程式時,我們必需在「javac」指令後方再加上「-d」參數,參數後方再加上目錄名稱,目前我們可以使用句點 ( . )來代替現行目錄。最後再加上需要編譯的程式名稱。例如: • 如果需要,您也可以一次編譯兩個以上的Java原始檔,例如: javac –d . myPackage.java javac –d . myPackage.java myPackage.java
套件 (Package) 的編譯與執行… • 如果不特別指定「-d」參數來編譯具有「package mypackage;」敘述的java原始檔。以範例中的「mypackage.java」為例,我們可以依照以下的方式來完成開發及編譯的流程: 一、在現行目錄下建立mypackage資料夾。 二、在現行目錄下使用編輯軟體撰寫程式。 三、將程式檔儲存在現行目錄下的mypackage資料夾中,並命名為「mypackage.java」。 四、在現行目錄下,使用「javac」指令,並指明程式檔的儲存相對路徑及檔名,來編譯程式。指令如下:「javac .\mypackage\mypackage.java」。
引用套件下的類別 • 我們可以利用「import」敘述來將相關的套件引入,並使用該套件中的類別檔。import敘述的使用方式如下: • 您可以在程式中重覆的使用「import」敘述,以便引入多個套件。程式中也可以使用「*」來代表要引入套件下的所有類別。 • 每個Java程式都會有預設的import敘述句,該敘述句會將java.lang套件下的所有類別引入。 import java.awt.color; import java.awt.*;
使用import static敘述-J2SE 5.0 • 新的import敘述句可以直接將類別中的static方法引入,讓使用該方法時,不需要再加上類別的名稱。新的import敘述句多了一個static關鍵字,語法如下: • 例如:如果要把out方法引入,我們可以使用以下的程式碼: • 引入之後,我們可以用以下的方法來使用out敘述句: import static 套件名稱.類別名稱.方法名稱; import static java.lang.System.out; out.println();
使用jar檔 • 「jar」是Java Archive的簡稱,它可以當作是類別的集合。 • jar是以ZIP的壓縮格式來處理的,您可以將某個package下的所有類別檔或是子目錄打包成一個jar檔案。 • 您只提供該jar檔,別人就可以使用您開發的程式了。您可以使用「jar」指令將檔案打包成單一的jar檔。「jar」的指令為: jar [參數] 目的檔名 要加入的檔案或路徑
使用jar檔… • 「jar」的指令可以使用的參數如下:
使用jar檔… jar -uvf test.jar myPackage\Update.class • 更新JAR檔案的內容:使用u參數 • 顯示JAR檔案的內容:使用tf參數 • 取出JAR檔案的內容:使用xf參數 jar uvf test.jar myPackage jar xf test.jar
使用JAR檔案中的類別 • 您有三種方式可以使用到某個JAR檔中的類別。 • 第一種方式是直接將JAR放在「JAVA_HOME」所設定的路徑中。 • 第二種方式是在每次編譯引入套件的Java檔案時,使用「classpath」參數來指明JAR檔案的位置。 • 第三種方式是直接設定CLASSPATH的路徑。 javac –classpath C:\Work\Chap8\display.jar UseJar.java