java中命名空間是什么
命名空間是用來組織和重用代碼的[1] 。如同名字一樣的意思,NameSpace(名字空間),之所以出來這樣一個東西,是因為人類可用的單詞數(shù)太少,并且不同的人寫的程序不可能所有的變量都沒有重名現(xiàn)象,對于庫來說,這個問題尤其嚴(yán)重,如果兩個人寫的庫文件中出現(xiàn)同名的變量或函數(shù)(不可避免),使用起來就有問題了,為了解決這個問題,引入了名字空間這個概念,通過使用 namespace xxx;你所使用的庫函數(shù)或變量就是在該名字空間中定義的,這樣一來就不會引起不必要的沖突了。
名字管理對任何程序設(shè)計語言來說,都是一個重要問題。如果你在程序的某個模塊里使用了一個名字,而其他人在這個程序的另一個模塊里也使用了相同的名字,那么怎樣才能區(qū)分這兩個名字并防止二者互相沖突呢?這個問題在 C 語言中尤其嚴(yán)重,因為程序往往包含許多難以管理的名字。C++類( Java 類基于此)將函數(shù)包于其內(nèi),從而避免了與其它類中的函數(shù)名沖突。然而,C++仍允許全局?jǐn)?shù)據(jù)和全局函數(shù)的存在,所以還是有可能發(fā)生沖突。為了解決這個問題,C++通過幾個關(guān)鍵字,引入了“名字空間”的概念。
Java 采用了一種全新的方法,能夠避免上述所有問題。為了給一個類庫生成不會與其它名字混淆的名字,Java 采用了與 Internet域名相似的指定符。實(shí)際上,Java設(shè)計者希望程序員反過來使用自己的 Internet域名,因為這樣可以保證它們肯定是獨(dú)一無二的。由于我的域名是BruceEckel.com ,所以我的各種奇奇怪怪的應(yīng)用工具類庫就被命名為com.bruceeckel.utility.foibles。反轉(zhuǎn)域名后,句點(diǎn)就用來代表子目錄的劃分。
設(shè)計者們發(fā)現(xiàn)這樣
做會引起一些問題,因此,現(xiàn)在整個包名都是小寫了。
Java2 的這種機(jī)制意味著所有的文件都能夠自動存活于它們自己的名字空間內(nèi),而且同一個文件內(nèi)的每個類都有唯一的標(biāo)識符。所以不必學(xué)習(xí)特殊的語言知識來解決這個問題——Java語言本身已經(jīng)為你解決了這個問題。
根據(jù)反轉(zhuǎn)域名得到相應(yīng)的命名空間的靈感大笑
運(yùn)用其它構(gòu)件
如果你想在自己的程序里使用預(yù)先定義好的類,那么編譯器就必須知道怎么定位它們。當(dāng)然,這個類可能就在發(fā)出調(diào)用的那個源文件中;在這種情況下,你就可以直接使用這個類——即使這個類在文件的后面才會被定義(Java 消除了“向前引用”問題,故不必考慮它)。
如果那個類位于其它文件中,又會怎樣呢?你可能會認(rèn)為編譯器應(yīng)該有足夠的智慧,能夠直接找到它的位置。但事實(shí)并非如此。想象下面的情況,如果你想使用一個特定名字的類,但其定義卻不止一份(假設(shè)這些定義各不相同)。更糟糕的是,假設(shè)你正在寫一個程序,在構(gòu)建過程中,你想將某個新類添加到類庫中,但卻與已有的某個類名沖突。
為了解決這個問題,你必須消除所有可能的混淆情況。為實(shí)現(xiàn)這個目的,你可以使用關(guān)鍵字import 來準(zhǔn)確地告訴編譯器你想要的類是什么。Import 指示編譯器導(dǎo)入一個包,也就是一個類庫(在其它語言中,一個庫不僅包含類,還可能包括方法和數(shù)據(jù);但是 Java 中的所有的代碼都必須寫在類里)。
大多時候,我們使用與編譯器附在一起的 Java 標(biāo)準(zhǔn)類庫里的構(gòu)件。有了這些構(gòu)件,你就不必寫一長串的反轉(zhuǎn)域名。舉例來說,只須像下面這么書寫就行了:import java.util.ArrayList;
這行代碼告訴編譯器,你想使用 Java 的 ArrayList類。但是,util 包含了數(shù)量眾多的類,有時你想使用其中的幾個,同時又不想明確地逐一聲明。那么你可以使用通配符“*”來很容
易地實(shí)現(xiàn)這個目的:
import java.util.*;
用這種方法一次導(dǎo)入一群類的方式倒是比一個一個地導(dǎo)入類的方式更常用。