程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java的包:庫單元

java的包:庫單元

編輯:關於JAVA

我們用import關鍵字導入一個完整的庫時,就會獲得“包”(Package)。例如:
import java.util.*;
它的作用是導入完整的實用工具(Utility)庫,該庫屬於標准Java開發工具包的一部分。由於Vector位於java.util裡,所以現在要麼指定完整名稱“java.util.Vector”(可省略import語句),要麼簡單地指定一個“Vector”(因為import是默認的)。
若想導入單獨一個類,可在import語句裡指定那個類的名字:
import java.util.Vector;
現在,我們可以自由地使用Vector。然而,java.util中的其他任何類仍是不可使用的。
之所以要進行這樣的導入,是為了提供一種特殊的機制,以便管理“命名空間”(Name Space)。我們所有類成員的名字相互間都會隔離起來。位於類A內的一個方法f()不會與位於類B內的、擁有相同“簽名”(自變量列表)的f()發生沖突。但類名會不會沖突呢?假設創建一個stack類,將它安裝到已有一個stack類(由其他人編寫)的機器上,這時會出現什麼情況呢?對於因特網中的Java應用,這種情況會在用戶毫不知曉的時候發生,因為類會在運行一個Java程序的時候自動下載。
正是由於存在名字潛在的沖突,所以特別有必要對Java中的命名空間進行完整的控制,而且需要創建一個完全獨一無二的名字,無論因特網存在什麼樣的限制。
迄今為止,本書的大多數例子都僅存在於單個文件中,而且設計成局部(本地)使用,沒有同包名發生沖突(在這種情況下,類名置於“默認包”內)。這是一種有效的做法,而且考慮到問題的簡化,本書剩下的部分也將盡可能地采用它。然而,若計劃創建一個“對因特網友好”或者說“適合在因特網使用”的程序,必須考慮如何防止類名的重復。
為Java創建一個源碼文件的時候,它通常叫作一個“編輯單元”(有時也叫作“翻譯單元”)。每個編譯單元都必須有一個以.java結尾的名字。而且在編譯單元的內部,可以有一個公共(public)類,它必須擁有與文件相同的名字(包括大小寫形式,但排除.java文件擴展名)。如果不這樣做,編譯器就會報告出錯。每個編譯單元內都只能有一個public類(同樣地,否則編譯器會報告出錯)。那個編譯單元剩下的類(如果有的話)可在那個包外面的世界面前隱藏起來,因為它們並非“公共”的(非public),而且它們由用於主public類的“支撐”類組成。
編譯一個.java文件時,我們會獲得一個名字完全相同的輸出文件;但對於.java文件中的每個類,它們都有一個.class擴展名。因此,我們最終從少量的.java文件裡有可能獲得數量眾多的.class文件。如以前用一種匯編語言寫過程序,那麼可能已習慣編譯器先分割出一種過渡形式(通常是一個.obj文件),再用一個鏈接器將其與其他東西封裝到一起(生成一個可執行文件),或者與一個庫封裝到一起(生成一個庫)。但那並不是Java的工作方式。一個有效的程序就是一系列.class文件,它們可以封裝和壓縮到一個JAR文件裡(使用Java 1.1提供的jar工具)。Java解釋器負責對這些文件的尋找、裝載和解釋(注釋①)。

①:Java並沒有強制一定要使用解釋器。一些固有代碼的Java編譯器可生成單獨的可執行文件。

“庫”也由一系列類文件構成。每個文件都有一個public類(並沒強迫使用一個public類,但這種情況最很典型的),所以每個文件都有一個組件。如果想將所有這些組件(它們在各自獨立的.java和.class文件裡)都歸納到一起,那麼package關鍵字就可以發揮作用)。
若在一個文件的開頭使用下述代碼:
package mypackage;
那麼package語句必須作為文件的第一個非注釋語句出現。該語句的作用是指出這個編譯單元屬於名為mypackage的一個庫的一部分。或者換句話說,它表明這個編譯單元內的public類名位於mypackage這個名字的下面。如果其他人想使用這個名字,要麼指出完整的名字,要麼與mypackage聯合使用import關鍵字(使用前面給出的選項)。注意根據Java包(封裝)的約定,名字內的所有字母都應小寫,甚至那些中間單詞亦要如此。
例如,假定文件名是MyClass.java。它意味著在那個文件有一個、而且只能有一個public類。而且那個類的名字必須是MyClass(包括大小寫形式):

package mypackage;
public class MyClass {
// . . .

現在,如果有人想使用MyClass,或者想使用mypackage內的其他任何public類,他們必須用import關鍵字激活mypackage內的名字,使它們能夠使用。另一個辦法則是指定完整的名稱:

mypackage.MyClass m = new mypackage.MyClass();

import關鍵字則可將其變得簡潔得多:

import mypackage.*;
// . . .
MyClass m = new MyClass();

作為一名庫設計者,一定要記住package和import關鍵字允許我們做的事情就是分割單個全局命名空間,保證我們不會遇到名字的沖突——無論有多少人使用因特網,也無論多少人用Java編寫自己的類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved