以下是一個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關鍵字的用法。