20 套件(Package)
Java程式編譯時如無命令列-d選項引數指定位元碼檔(.class檔)存放目錄(資料夾),將和原始碼檔(.java檔)並存於同一資料夾,且有可能所有程式之原始碼檔、位元碼檔都混在一起。為了將同一組功能的程式(例如人事系統、銷售系統等)同放在一個資料夾,以資和其他功能的程式作區別,雖然單單使用-d選項引數也可達到目的,但使用套件(Package或稱為包裹)之功能,則更見效率。
套件另一功用為防止相同的類別名稱造成的問題,不同之功能但具相同的類別名稱,可分別歸類為不同的套件,即可防止類別誤用。當然也可能兩個人都定相同的套件名稱,解決之道是以個人的域名反置作為套件名稱的一部分。
套件名稱習慣上使用小寫字母。
<套件設定格式>
package 套件名稱;
套件設定敘述須置於Java程式最前端。
<套件編譯時之格式>
javac –d 目錄(資料夾) 類別原始碼檔名;
目錄可指定相對路徑或絕對路徑,沒有預先建立目錄時,編譯時會自動建立以套件名稱為名之目錄。
<套件引用格式>指建立非本身套見之物件等。
import 套件名稱.[ * | 位元檔名稱];
非public類別不可被同一目錄或套件以外之類別呼叫引用。
[20-1套件(Package)名稱結構]
<指定方式>
於程式中除了註解外第一行置入:
package 套件名稱;
套件名稱可為一階、二階,甚至多階,每一階都對應一個目錄(資料夾)。
<例>
一階:d11
二階:d11.d12、d21.d22
三階以上的多階:javas1.d21.d22
d11、d12、d21、d22、javas1都是目錄,套件名稱在前者為上位目錄,套件名稱在後者為下位目錄。
[20-2建立套件(Package)]
<指定方式>
必須於編譯單元(compilation unit),即程式原始碼內第一行置入package敘述:
package 套件名稱;
<例>
package d11;或
package d11.d12;或
package javas1.d21.d22
套件目錄可事前建立,如果沒有事前建立,會在編譯時同時建立。
編譯時套件目錄之建立,是以現行目錄為基準,可以指定相對路徑及絕對路徑來建立。
[相對路徑]
可指定編譯時現行目錄的相對位置,如現行目錄下,或前一、二、多個目錄之下的套件目錄,如尚未有套件目錄,則建立之。
<編譯時命令列引數格式>
javac –d .[.][.]… 類別原始碼檔名
(-d後之「.」表示現行目錄下建立套件目錄,2個「.」表示現行目錄之前一目錄下建立套件目錄,其餘類推。)
[絕對路徑]
編譯時指定路徑全名的絕對位置,路徑最低階目錄之下為套件目錄,如尚未有套件目錄,則建立之。
<編譯時命令列引數格式>
javac –d 絕對路徑 類別原始碼檔名
(表示在絕對路徑目錄下建立套件目錄。)
<範例1><相對目錄>尚未建立套件目錄
編譯時目錄為C槽之javas1目錄。
package d11.d12; //套件d11.d12
public class PM12{
public static void main(String[] args){
System.out.println("為鼠常留飯,憐蛾不點燈");
}
}
編譯前目錄:C槽下有javas1及javas2目錄,原始碼檔存放於目錄javas1。
C: |
javas1 PM12.java |
|
|
|
|
||
javas2 |
|
|
編譯:
C:\Users\CTC-Mobile>cd C:\javas1
(切換現行目錄(cd)至javas1)
C:\javas1>javac -d . PM12.java
(-d指定編譯後.class檔的輸出目錄,「.」表示現行目錄,套件則會是在其下的目錄)
編譯後目錄:C槽下原有javas1及javas2目錄,因編譯時目錄為C:\javas1,故編譯後現行目錄下,新增了套件目錄d11及d11下的d12,編譯後的位元碼檔PM12.class置於目錄d12內。
C: |
javas1 PM12.java |
d11 |
d12 PM12.class |
|
|
||
javas2 |
|
|
<範例2><相對目錄>已建有套件目錄
package d11.d12; //套件d11.d12
public class PGA2 {
public void pgmda2(){
System.out.println ("人能咬得菜根,則百事可成" ) ;
}
}
編譯前目錄:前一範例已建有d11.d12目錄。
C: |
javas1 PM12.java PGA2.java |
d11 |
d12 PM12.class |
|
|
||
javas2 |
|
|
編譯:
C:\javas1>javac -d . PGA2.java
編譯後目錄:編譯後的位元碼PGA2直接置於目錄d12內。
C: |
javas1 PM12.java PGA2.java |
d11 |
d12 PM12.class PGA2.class |
|
|
||
javas2 |
|
|
<範例3>[絕對路徑]已有目錄d11。
package d11; //套件d11
public class PM11{
public static void main(String[] args){
System.out.println("交友須帶三分俠氣,做人要存一點素心");
}
}
編譯前目錄:已建有目錄d11。
C: |
javas1 PM12.java PGA2.java PM11.java |
d11 |
d12 PM12.class PGA2.class |
|
|
||
javas2 |
|
|
編譯:
C:\javas1>javac -d C:\javas1 PM11.java
(-d後指定的是絕對路徑,套件目錄在其下)
編譯後目錄:因已建有目錄d11,故編譯後的位元碼PM11直接置於目錄d11內。
C: |
javas1 PM12.java PGA2.java PM11.java |
d11 PM11.class |
d12 PM12.class PGA2.class |
|
|
||
javas2 |
|
|
註:d11套件和d11.d12為不同之套件,d11套件之位元碼放置於目錄d11內。d11.d12套件之位元碼放置於目錄d12內。
<範例4>[相對路徑]
package d11; //套件d11
public class PGA1{
public void pgmda1(){
System.out.println("此身常放在閒處,榮辱得失誰能差遣我");
}
}
編譯前目錄:已建有目錄d11。
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java |
d11 PM11.class |
d12 PM12.class PGA2.class |
|
|
||
javas2 |
|
|
編譯:
C:\javas1\d11\d12>javac -d C:\javas1 C:\javas1\PGA1.java
(-d後之資料夾目錄為放置套件目錄之用,其後底線部分為放置原始碼之目錄。)
編譯後目錄:因已建有目錄d11,故編譯後的位元碼PGA1直接置於目錄d11內。
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class |
|
|
||
javas2 |
|
|
<範例5>[相對路徑]
package d22; //套件d22
public class PM22{
public static void main(){
System.out.println("我有功於人不可念,而過則不可不念。");
}
}
編譯前目錄:未建目錄d22。(須先建立目錄d21)
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class |
d21 |
|
||
javas2 |
|
|
編譯:
C:\javas1\d11\d12>cd C:\javas1\d21
C:\javas1\d21>javac -d . C:\javas1\PM22.java
(因現行目錄已改為C:\javas1\d21,故須指定原始碼檔PM22存放目錄C:\javas1)
編譯後目錄:C:\javas1\d21下新建d22目錄。
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class |
d21 |
d22 PM22.class |
||
javas2 |
|
|
<範例6>[絕對路徑]
package d22; //套件名d22
public class PGB2{
public void pgmdb2(){
System.out.println("人有恩於我不可忘,而怨則不可不忘");
}
}
編譯前目錄:已建目錄d22。
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class
|
d12 PM12.class PGA2.class |
d21 |
d22 PM22.class
|
||
javas2 |
|
|
編譯:
C:\javas1\d21>javac -d C:\javas1\d21 C:\javas1\PGB2.java
編譯後目錄:
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class
|
d21 |
d22 PM22.class PGB2.class
|
||
javas2 |
|
|
前述目錄以另一種方式呈現如下:
[20-3 Default Package]
在同一個目錄,但沒有設定套件的程式,都視為預設的套件(Default Package),它們都擁有此一目錄Default Package的權限,存取權限控制將另闢專章說明。
[20-4套件的引用]
<指定方式>
於原始程式碼置入:
import 套件名稱.[ * | 位元檔名稱];
非public類別不可被同一目錄(資料夾)或套件以外之類別呼叫引用。
<範例7>引用package d11.d12之PGA2.class。
import d11.d12.PGA2; //引用單一位元碼檔
public class PkgMa2 {
public static void main(String[] args){
PGA2 a2 = new PGA2();
a2.pgmda2();
}
}
編譯前目錄:原始碼檔放置目錄javas2。
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class
|
d12 PM12.class PGA2.class |
d21 |
d22 PM22.class PGB2.class
|
||
javas2 PkgMa2.java |
|
|
編譯:
C:\Users\CTC-Mobile>cd C:\javas2
(切換至原始碼所在的目錄C:\javas2)
C:\javas2>javac -cp C:\javas1 PkgMa2.java
(以-cp指定PGA2所屬套件d11.d12的上位目錄C:\javas1,位元碼因未以-d引數指定,則會置放於現行javas2目錄)
編譯後目錄:
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class
|
d21 |
d22 PM22.class PGB2.class
|
||
javas2 PkgMa2.java PkgMa2.class |
|
|
執行:
C:\javas2>java -cp C:\javas1;C:\javas2 PkgMa2
人能咬得菜根,則百事可成
(執行時必須以系統變數CLASSPATH或命令列引數-cp指定兩個位元碼檔所在之目錄,即PkgMa2的C:\javas2及套件d11.d12的PGA2的上位目錄,即C:\javas1)
(註:系統變數及命令列引數將另闢專章說明)
<範例8>引用package d22之PGB2.class。
import d22.*; //使用*表示d22之所有位元碼檔
public class PkgMb2 {
public static void main(String[] args){
PGB2 b2 = new PGB2();
b2.pgmdb2();
}
}
編譯前目錄:
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class
|
d12 PM12.class PGA2.class |
d21 |
d22 PM22.class PGB2.class
|
||
javas2 PkgMa2.java PkgMa2.class PkgMb2.java |
|
|
編譯:
C:\javas2>javac -cp C:\javas1\d21 PkgMb2.java
編譯後目錄:
C: |
javas1 PM12.java PGA2.java PM11.java PGA1.java PM22.java PGB2.java |
d11 PM11.class PGA1.class |
d12 PM12.class PGA2.class
|
d21 |
d22 PM22.class PGB2.class
|
||
javas2 PkgMa2.java PkgMa2.class PkgMb2.java PkgMb2.class |
|
|
執行:
C:\javas2>java -cp C:\javas1\d21;C:\javas2 PkgMb2
人有恩於我不可忘,而怨則不可不忘
完整目錄結構以另一種方式呈現。
(註:Package和JAR壓縮檔的關係,將另闢專章說明)
留言列表