Java package關鍵字的用法

以下是一個Java Class(類別)的結構:

 

package <package_name>;

import <other_packages>;

 

public class ClassName {

    <variables(also known as fields)>;

    <constructor(s)>;

    <other methods>; 

 }

ClassName{ }內定義的是某一個Class(類別)的程式內容。然而這不是這篇文章的重點,這篇文章的重點在package的用法。當類別一開始有陳述package關鍵字時,就代表給予這個類別一個名稱空間(Namespace)主要用意是防止跟其他類別混淆(就算是相同類別名字但屬於不同名稱空間,仍然能被區分出是不同類別)

另外就是相同package的類別表示那些類別的程式碼會存放在作業系統的同一個資料夾內

如果我們所撰寫的類別沒有定義名稱空間(Namespace),編譯出來的.class都放置在同一個資料夾下,這不是個很好的管理方式。

舉個例子:

在公司可能會有不同的開發部門,若不以資料夾方式來分別放置不同部門開發的.class檔。那麼若A部門寫了個Cust類別並編譯為Cust.class;B部門也寫了個Cust類別,也編譯為Cust.class。結果,因為這二個部門所開發的.class檔都放在同一個資料夾內,可想而知,相同名字的檔案是不是就會發生檔案覆蓋的問題。

所以Java提供了package關鍵字讓開發人員能設計自己的名稱空間(Namespace),主要也就是在防止這類的問題。

然而在操作上需要注意一些事項:

首先,在一個.java檔裡面,package語句一定要放在程式碼的最前面。

接下來我們來看一個例子:

在/home/oracle/myJava_progs資料夾裡,目前只有一個已開發好的Java 程式,檔名為PackageTest.java

[oracle@oracleDB ~]$ cd /home/oracle/myJava_progs

[oracle@oracleDB myJava_progs]$ ls

PackageTest.java

程式碼如下:

[oracle@oracleDB myJava_progs]$ cat PackageTest.java

package com.example.domain;

class BeRefed{

protected int x = 10;

}

public class PackageTest{

public static void main(){

BeRefed a = new BeRefed();

System.out.println(a.x);

}

}

看得出來在第一行有使用package關鍵字來定義該.java檔內的Classes(類別們)要放置、保存的「名稱空間(Namespace)」

然而當我們使用javac來編譯PackageTest.java時,所產生的兩個.class檔BeRefed.class及PackageTest.class所存放的資料夾卻是在/home/oracle/myJava_progs下,而非我們所預期的/home/oracle/myJava_progs/com/example/domain資料夾下

莫非是因為我們沒有手動在/home/oracle/myJava_progs路徑下建置./com/example/domain 資料夾?

現在我們就來證明看看:

首先,先將原本的BeRefed.class及PackageTest.class刪除

[oracle@oracleDB myJava_progs]$ rm *.class

[oracle@oracleDB myJava_progs]$ ls

PackageTest.java

接下來在/home/oracle/myJava_progs路徑下建置./com/example/domain資料夾

[oracle@oracleDB myJava_progs]$ mkdir -p com/example/domain/

[oracle@oracleDB myJava_progs]$ ls

com  PackageTest.java

[oracle@oracleDB myJava_progs]$ ls /home/oracle/myJava_progs/com/example/domain

[oracle@oracleDB myJava_progs]$ javac PackageTest.java

事實證明,編譯完的.class檔仍然沒有出現在/home/oracle/myJava_progs/com/example/domain資料夾下,還是在原本的/home/oracle/myJava_progs路徑下。

[oracle@oracleDB myJava_progs]$ ls /home/oracle/myJava_progs/com/example/domain

[oracle@oracleDB myJava_progs]$ ls

BeRefed.class  com  PackageTest.class  PackageTest.java

要讓編譯完成後.class檔存放在我們希望的目錄路徑下,執行javac時需要加上-d的選項,透過

-d 可以指定編譯完成後的.class 檔案存放的路徑。

接下來我們就來操作一遍給大家看:

假設我們希望未來編譯好的.class檔都統一存放講/home/oracle/myJava_class目錄路徑下,目前該目錄路徑下都沒任何子資料夾及檔案

[oracle@oracleDB myJava_progs]$ ls /home/oracle/myJava_class

[oracle@oracleDB myJava_progs]$

當我們執行javac時加上-d的選項指定編譯完成後的.class 檔案要存放在/home/oracle/myJava_class這個目錄路徑

[oracle@oracleDB myJava_progs]$ javac -d /home/oracle/myJava_class PackageTest.java

這時再來驗證一下,你將發現在/home/oracle/myJava_class目錄路徑下自動產生了./com/eample/domain 子資料夾,而編譯完成後的.class 檔案就存放在該子資料夾下

[oracle@oracleDB myJava_progs]$ ls /home/oracle/myJava_class

com

[oracle@oracleDB myJava_progs]$ ls /home/oracle/myJava_class/com/example/domain/

BeRefed.class  PackageTest.class

[oracle@oracleDB myJava_progs]$

以上談到的就是package關鍵字的用法。

 

發表留言