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