在所有程序設計語言裡,一個不可避免的問題是對名字或名稱的控制。假設您在程序的某個模塊裡使用了一個名字,而另一名程序員在另一個模塊裡使用了相同的名字。此時,如何區分兩個名字,並防止兩個名字互相沖突呢?這個問題在C語言裡特別突出。因為程序未提供很好的名字管理方法。C++的類(即Java類的基礎)嵌套使用類裡的函數,使其不至於同其他類裡的嵌套函數名沖突。然而,C++仍然允許使用全局數據以及全局函數,所以仍然難以避免沖突。為解決這個問題,C++用額外的關鍵字引入了“命名空間”的概念。
由於采用全新的機制,所以Java能完全避免這些問題。為了給一個庫生成明確的名字,采用了與Internet域名類似的名字。事實上,Java的設計者鼓勵程序員反轉使用自己的Internet域名,因為它們肯定是獨一無二的。由於我的域名是BruceEckel.com,所以我的實用工具庫就可命名為com.bruceeckel.utility.foibles。反轉了域名後,可將點號想象成子目錄。
在Java 1.0和Java 1.1中,域擴展名com,edu,org,net等都約定為大寫形式。所以庫的樣子就變成:COM.bruceeckel.utility.foibles。然而,在Java 1.2的開發過程中,設計者發現這樣做會造成一些問題。所以目前的整個軟件包都以小寫字母為標准。
Java的這種特殊機制意味著所有文件都自動存在於自己的命名空間裡。而且一個文件裡的每個類都自動獲得一個獨一無二的標識符(當然,一個文件裡的類名必須是唯一的)。所以不必學習特殊的語言知識來解決這個問題——語言本身已幫我們照顧到這一點。