20   套件(Package)

Java程式編譯時如無命令列-d選項引數指定位元碼檔(.class)存放目錄(資料夾),將和原始碼檔(.java)並存於同一資料夾,且有可能所有程式之原始碼檔、位元碼檔都混在一起。為了將同一組功能的程式(例如人事系統、銷售系統等)同放在一個資料夾,以資和其他功能的程式作區別,雖然單單使用-d選項引數也可達到目的,但使用套件(Package或稱為包裹)之功能,則更見效率。

套件另一功用為防止相同的類別名稱造成的問題,不同之功能但具相同的類別名稱,可分別歸類為不同的套件,即可防止類別誤用。當然也可能兩個人都定相同的套件名稱,解決之道是以個人的域名反置作為套件名稱的一部分。

套件名稱習慣上使用小寫字母。

<套件設定格式>

package 套件名稱;

套件設定敘述須置於Java程式最前端。

<套件編譯時之格式>

javac –d 目錄(資料夾) 類別原始碼檔名;

目錄可指定相對路徑或絕對路徑,沒有預先建立目錄時,編譯時會自動建立以套件名稱為名之目錄。

<套件引用格式>指建立非本身套見之物件等。

import 套件名稱.[ * | 位元檔名稱];

public類別不可被同一目錄或套件以外之類別呼叫引用。

 

 

[20-1套件(Package)名稱結構]

<指定方式>

於程式中除了註解外第一行置入:

package 套件名稱;

 

套件名稱可為一階、二階,甚至多階,每一階都對應一個目錄(資料夾)

<>

一階:d11

二階:d11.d12d21.d22

三階以上的多階:javas1.d21.d22

d11d12d21d22javas1都是目錄,套件名稱在前者為上位目錄,套件名稱在後者為下位目錄。

 

 

[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槽下有javas1javas2目錄,原始碼檔存放於目錄javas1

C:

javas1

PM12.java

 

 

 

 

javas2

 

 

 

編譯:

C:\Users\CTC-Mobile>cd C:\javas1

(切換現行目錄(cd)javas1)

C:\javas1>javac -d . PM12.java

(-d指定編譯後.class檔的輸出目錄,「.」表示現行目錄,套件則會是在其下的目錄)

 

編譯後目錄:C槽下原有javas1javas2目錄,因編譯時目錄為C:\javas1,故編譯後現行目錄下,新增了套件目錄d11d11下的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-1

 

[20-3 Default Package]

在同一個目錄,但沒有設定套件的程式,都視為預設的套件(Default Package),它們都擁有此一目錄Default Package的權限,存取權限控制將另闢專章說明。

 

 

[20-4套件的引用]

<指定方式>

於原始程式碼置入:

import 套件名稱.[ * | 位元檔名稱];

public類別不可被同一目錄(資料夾)或套件以外之類別呼叫引用。

 

<範例7>引用package d11.d12PGA2.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指定兩個位元碼檔所在之目錄,即PkgMa2C:\javas2及套件d11.d12PGA2的上位目錄,即C:\javas1)

(註:系統變數及命令列引數將另闢專章說明)

 

<範例8>引用package d22PGB2.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

人有恩於我不可忘,而怨則不可不忘

 

完整目錄結構以另一種方式呈現。

圖20-2

(註:PackageJAR壓縮檔的關係,將另闢專章說明)

arrow
arrow
    文章標籤
    java 物件導向 套件
    全站熱搜
    創作者介紹
    創作者 祈泊 的頭像
    祈泊

    祈泊的部落格

    祈泊 發表在 痞客邦 留言(0) 人氣()