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