包
| 導航 語言基礎 主題: |
如果您的應用程式變得相當大,您可能會有很多類。儘管您可以按字母順序瀏覽它們,但這會變得很混亂。因此,您的應用程式類可以被分類到包中。
包是一個名稱空間,主要包含類和介面。例如,標準類ArrayList位於包java.util中。對於此類,java.util.ArrayList被稱為其完全限定名,因為這種語法沒有歧義。不同包中的類可以具有相同的名稱。例如,您有兩個類java.util.Date和java.sql.Date,它們是不一樣的。如果在類中沒有宣告任何包,則其包是預設包。
在類中,包宣告位於原始碼的頂部,使用關鍵字package
程式碼清單 3.14:BusinessClass.java
package business;
public class BusinessClass {
}
|
如果你的類是在一個包中宣告的,比如 business,你的類必須放置在應用程式資料夾根目錄下的一個名為 business 的子資料夾中。這是編譯器和類載入器在檔案系統中查詢 Java 檔案的方式。你可以在一個子包中宣告你的類,比如 engine。所以完整的包是 business.engine,並且類必須放置在 business 子資料夾中的一個名為 engine 的子子資料夾中(而不是在一個名為 business.engine 的資料夾中)。
使用包中宣告的類的最簡單方法是在類名前面加上它的包名
程式碼段 3.88:包宣告。
business.BusinessClass myBusinessClass = new business.BusinessClass();
|
如果你正在從同一個包中的類使用該類,你不需要指定包名。如果另一個包中存在具有相同名稱的類,它將使用本地類。
上面的語法有點冗長。你可以使用 import Java 關鍵字在檔案頂部匯入類,然後只指定它的名稱
程式碼清單 3.15:MyClass.java
import business.BusinessClass;
public class MyClass {
public static void main(String[] args) {
BusinessClass myBusinessClass = new BusinessClass();
}
}
|
注意,你不能在兩個不同的包中匯入兩個具有相同名稱的類。
類 Integer 和 String 屬於包 java.lang,但它們不需要匯入,因為 java.lang 包在所有類中都是隱式匯入的。
可以使用星號匯入整個包
程式碼段 3.89:萬用字元匯入。
import javax.swing.*;
|
雖然這看起來很方便,但如果出現打字錯誤,可能會導致問題。例如,如果你使用上面的匯入來使用 JFrame,但然後輸入 JFraim frame = new JFraim();,Java 編譯器將報告一個類似於“無法找到符號:JFraim”的錯誤。即使它看起來像是被匯入了,編譯器會在你第一次提到 JFraim 時給出錯誤報告,而這時你的程式碼已經進行了一半,而不是在你匯入 JFrame 以及 javax.swing 中所有其他內容的地方。
如果你將其改為 import javax.swing.JFraim;,錯誤將在匯入處出現,而不是在程式碼中。
此外,如果你 import javax.swing.*; 和 import java.util.*;,並且 javax.swing.Queue 在 Java 的未來版本中被新增,你使用 Queue(java.util)的程式碼將無法編譯。這個特定的例子不太可能發生,但如果你正在使用非 Oracle 庫,它發生的可能性更大。
包名應該以小寫字元開頭。這有助於區分包名和類名。在一些作業系統中,目錄名不區分大小寫。因此包名應該小寫。
Java 包需要在不同廠商之間保持唯一性,以避免命名衝突。為此,廠商通常使用反轉的域名。這樣可以保證唯一性。例如,一家名為“您的公司有限公司”的公司可以使用類似於這樣的包名:com.yourcompany.yourapplicationname.yourmodule.YourClass。
如果你正在匯入位於 .jar 檔案中的庫包和類,你必須確保該檔案在當前類路徑中(在編譯和執行時)。除了這個要求之外,匯入這些包和類與它們位於完整的擴充套件目錄結構中時相同。
例如,要編譯和執行專案頂層目錄中的一個類(包含兩個目錄 /source 和 /libraries),你可以使用以下命令
編譯
$ javac -classpath libraries/lib.jar source/MainClass.java |
然後執行它,類似地
執行
$ java -classpath libraries/lib.jar source/MainClass |
以上是簡化的,並且要求 MainClass 在預設包中,或者在名為 source 的包中,這不是很理想。
使用 BlueJ,只需點選“工具、首選項、庫”,然後逐個新增 .jar 檔案。
Java 中一個類的執行時標識由其完全限定類名及其定義的類載入器決定。這意味著同一個類,由兩個不同的類載入器載入,在虛擬機器看來是兩種完全不同的型別。