Java建立包與檔案
為Java 建立一個原始碼檔案的時候,它通常叫作一個“編輯單元”(有時也叫作“翻譯單元”)。每個編譯單元都必須有一個以.java 結尾的名字。而且在編譯單元的內部,可以有一個公共(public)類,它必須擁有與檔案相同的名字(包括大小寫形式,但排除.java 副檔名)。如果不這樣做,編譯器就會報告出錯。每個編譯單元內都只能有一個public 類(同樣地,否則編譯器會報告出錯)。那個編譯單元剩下的類(如果有的話)可在那個包外面的世介面前隱藏起來,因為它們並非“公共”的(非public),而且它們由用於主public 類的“支撐”類組成。
編譯一個.java 檔案時,我們會獲得一個名字完全相同的輸出檔案;但對於.java 檔案中的每個類,它們都有一個.class 副檔名。因此,我們最終從少量的.java 檔案裡有可能獲得數量眾多的.class 檔案。如以前用一種組合語言寫過程式,那麼可能已習慣編譯器先分割出一種過渡形式(通常是一個.obj 檔案),再用一個連結器將其與其他東西封裝到一起(生成一個可執行檔案),或者與一個庫封裝到一起(生成一個庫)。但那並不是Java 的工作方式。一個有效的程式就是一系列.class
檔案,它們可以封裝和壓縮到一個JAR 檔案裡。Java 直譯器負責對這些檔案的尋找、裝載和解釋。
“庫”也由一系列類檔案構成。每個檔案都有一個public 類(並沒強迫使用一個public 類,但這種情況最很典型的),所以每個檔案都有一個元件。如果想將所有這些元件(它們在各自獨立的.java 和.class 檔案裡)都歸納到一起,那麼package 關鍵字就可以發揮作用)。
若在一個檔案的開頭使用下述程式碼:
package mypackage;
那麼package 語句必須作為檔案的第一個非註釋語句出現。該語句的作用是指出這個編譯單元屬於名為mypackage 的一個庫的一部分。或者換句話說,它表明這個編譯單元內的public 類名位於mypackage 這個名字的下面。如果其他人想使用這個名字,要麼指出完整的名字,要麼與mypackage 聯合使用import 關鍵字(使用前面給出的選項)。注意根據Java 包(封裝)的約定,名字內的所有字母都應小寫,甚至那些中間單詞亦要如此。
例如,假定檔名是MyClass.java。它意味著在那個檔案有一個、而且只能有一個public 類。而且那個類
的名字必須是MyClass(包括大小寫形式):
package mypackage;
public class MyClass {
// . . .
現在,如果有人想使用MyClass,或者想使用mypackage 內的其他任何public 類,他們必須用import 關鍵字啟用mypackage 內的名字,使它們能夠使用。另一個辦法則是指定完整的名稱:
mypackage.MyClass m = new mypackage.MyClass();
import 關鍵字則可將其變得簡潔得多:
import mypackage.*;
// . . .
MyClass m = new MyClass();
作為一名庫設計者,一定要記住package 和import 關鍵字允許我們做的事情就是分割單個全域性名稱空間,保證我們不會遇到名字的衝突——無論有多少人使用因特網,也無論多少人用Java 編寫自己的類。