2009-11-19 51 views
4

表觀層次結構在這篇文章中http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html

到款「套餐的表觀層次」寫到:

「」起初,包似乎是分層的,但事實並非如此。例如,Java API包含一個java.awt包,一個java.awt.color包,一個java.awt.font包以及許多以java.awt開頭的其他包。然而,java.awt包中沒有包含java.awt.color包,java.awt.font包和其他java.awt.xxxx包。 「」

但是如果我unjar rt.jar我發現java.awt.color和java.awt.font被映射爲 分層的方式:java/awt/color和java/awt/font所以我理解不好或在該帖子中是否有錯誤?

但是有可能創建不分層包?邏輯包名稱與物理包結構不匹配?

回答

6

您參考的文章解釋了下一段中的要點。這些軟件包的名稱是用來表示與程序員眼睛的關係,但在編譯器的眼中沒有任何關係。正如文章解釋導入java.awt.*不會導入java.awt.font中的任何類,它們是完全獨立的包,它們在編程語言中沒有任何層次關係。要導入java.awt.font中的所有類,必須導入java.awt.font.*,並且不會導入父包java.awt中的任何類或像兄弟包java.awt.color中的任何類。

因此,即使與程序員有明顯的層次關係,在語言中確實沒有任何關係。要訪問給定包中的類,您必須從其確切的包中導入它們。

如果包實際上是層次結構,那麼可以想象這將是這種情況。然而,層次結構只是爲了組織代碼並向程序員提示一組給定的包可以一起使用。

7

文章繼續

導入java.awt中。*進口的所有 在java.awt包中它不會導入java.awt.Color中的類型,但 的, java.awt.font中,或任何其他 java.awt.xxxx包。

所以它只是描述import語句的一般行爲:import package.*進口package所有類,但沒有從類子包。

是的,類文件在rt.jar中,正如我們所期望的那樣,這只是關於在java源文件中導入類。

編輯

是,該教程它增加了一定程度的混亂。

嘗試將包理解爲共享通用名稱空間的類的集合。 java.awt是命名空間,java.langjava.awt.color是另一個命名空間。現在明白了,java.awtjava.awt.color名稱空間是沒有關係的。 java.awt.color不是java.awt的「子」名稱空間。事實上,在Java中沒有規定你必須將某些類放在某些「子」包中。如果有層次結構,我希望像實現這樣的規則必須在接口的「子名稱空間」中聲明,等等。但沒有任何

是的,名稱空間到文件系統的實際映射引入了一個文件夾hierachie,其中color是awt中的一個文件夾。這非常實用,否則我們需要在文件系統中的包名稱空間和類的物理位置之間進行映射。現在我們可以從包名稱空間中確定位置。這導致了這樣的印象,即這個域名也適用於包名稱空間。

但事實並非如此。這就是本教程想說的。

(謝謝了問題,我學到和了解了很多東西,思考答案;))

+0

yes但段落說「」起初,包似乎是分層的,但它們不是「但它們在並行文件系統結構中是分層的,所以顏色包被包含在java.awt包中。段落說另一件事... – xdevel2000 2009-11-19 15:44:35

+0

反應是很大的評論,請看看我最近編輯答案 – 2009-11-19 17:06:43

3

什麼教程的意思是,沒有在Java中的子包的概念。包可能在物理上位於文件系統的子文件夾中,但這並不意味着它會自動包含在內(請參閱Andreas' answer)。

它也不會讓更高級別的包中的類訪問package-private(default-scoped)類,正如您可能期望的那樣,如果存在包層次結構。

1

命名方案等級,以及jar文件的內容。

但是,java.awt和java.awt.color之間沒有連接,例如,如果您在程序包foo中將類聲明爲包private(無修飾符),則它將可訪問從foo,但不是從foo.bar

0

想像文件系統一樣的層次結構。在Java中,包就像目錄,類就像文件一樣。包意味着包含一組相關的類。如果有多組邏輯上相關的軟件包,則可以對其進行命名,以便它們顯示爲較大層次結構的成員。查看上面的java.awt。*示例,我可以將AWT的類放入jar1中。它將具有以下結構:

jar-1 
    \-java 
     \-awt 

在awt目錄中,您會發現聲明自己是java.awt包成員的類和接口。

現在我要實現對AWT一些字體,但我把它們放在一個單獨的jar:

jar-2 
    \-java 
    \-awt 
     \-fonts 

的字體目錄是類和接口是我的AWT創建的字體。

當您使用AWT和字體進行編程時,首先必須在CLASSPATH中同時包含jar-1和jar-2。當你去到包括類,如果你想要的字體,你沒有得到任何反饋,編譯器發現他們在瓶子裏。

//this loads all classes in the java.awt directory 
// which happen to come from jar-1 
include java.awt.* 

//Load all classes in the java.awt.fonts directory 
// which happen to come from jar-2 
include java.awt.fonts.* 

編譯器和運行時層級看起來像一棵大樹。這並不意味着所有的班級都在同一個地方居住。說了我必須寫兩點; 1)不推薦將相同層次中的包分離爲不同的jar包,因爲這會引起混淆和維護頭痛,並且2)將包聲明爲別人包結構的擴展是非常糟糕的形式,即使編譯器允許你這樣做。