摘要: 在Java的程序設計中,為了更容易地找到和使用類和接口、避免名稱沖突,以及控制訪問,提高程序的可讀性和可重用性,Java提供包來管理類和接口。本文從包的作用、包的定義、創建包、引用包、管理包和設置類路徑等方面進行論述,討論了有關包中類的訪問原則,以及導入包的注意事項。
關鍵詞: Java體系架構包管理機制應用策略
在類的管理和使用上,微軟公司推出的NET技術采用命名空間的形式,而SUN公司的Java采用包的形式。Java編譯器為每個類生成一個字節碼文件,且文件名與Public的類名相同,因此同名的類有可能發生沖突。為了解決這一問題,Java提供包來管理類名空間。包實際上提供了一種命名機制和可見性限制機制。包是一種松散的類的集合,同一個包中的類在默認情況下可以互相訪問,所以為了方便編程和管理,我們通常把需要在一起工作的類和接口放在一個包里。我們可以利用包的訪問控制能力從更宏觀的角度對類進行訪問權限的控制。
1.包的作用
1.1組織文件
現實的計算機系統常常使用目錄來管理文件,Java語言里采用Package機制,Java編譯器把包對應于文件系統的目錄管理,按照樹的方式管理許多不同功能的Java文件。Package可以使數量龐大的文件顯得清晰、有條理。將類和接口封裝在不同的包中,主要是為了解決名字空間、名字沖突,它與類的繼承沒有關系,可更大限度地避免重名類的沖突。
1.2權限管理
Package是相關的類和接口的集合,能提供訪問保護和用以管理這些字節文件,是Java系統中對象和接口等基本要素進行模塊化管理的基本手段。包參與了類和類的成員變量的訪問權限封裝功能,對于具有Private訪問權限的類和Friendly成員變量,包具有對它們進行隱藏的功能,也就是說,不同包內Private類和Friendly的成員變量是不能被訪問到的,相反,如果是同個包內這樣的條件是可以訪問到的。所以包能有效地管理和封裝眾多的類和接口;同時,包的權限管理功能也完善了Java完全面向對象能力。
2.包的使用
2.1定義
包(Package)是一個相關的類和接口的集合,它可以提供訪問保護和名稱空間管理。
2.2創建包
創建包的辦法是將一個類或接口放進去。為此,在定義類或接口的源代碼文件的頂部放一個Package語句。如果在源文件中沒有Package語句,那么類或接口將放在默認包(Default Package)中,這個包沒有名字。程序員可以定義自己的包并且可以引用它,還可以引用Java系統定義的包,在包中可以存放一個或者多個類。
包的定義格式:package<包名>;
其中package是關鍵字,包名是Java任意合法的標志符。
例如:package com.sxx //聲明名為com.sxx的包。
public class Myclass{…}
注意:
(1)Package語句必須寫在Java源程序的第一行。
(2)在一個程序中不能出現多條package語句。
(3)Package語句的作用域是整個源代碼文件。
2.3命名包
世界各地的程序員都在使用Java語言編寫類和接口,很可能有兩個程序員給兩個不同的類起了相同的名稱,但是Java允許兩個類同名,因為它們在不同的包中,而每個類的完全限定名包含包的名稱。包名的命名原則是反域名形式。如:com.company.package。
2.4導入包和使用包的成員
Java編譯器為所有程序自動引入java.lang包中的所有類,此時不必用import語句,但是若需要使用其它包中的類,就必須在Java源程序中使用import語句導入。
import語句的格式為:import<包名1<類名>|*>[,<包名2<類名>|*>[,……];其中import是關鍵字,多個包名和類名之間用“;”分割,包名和類名之間使用“.”分隔。
2.4.1訪問包的公共類
類的訪問級別只有2級:缺省級(default)和公共級(public)。只有公共級的類可以從包外訪問,而且要求此時的Java文件名必須和類名保持一致。
Java提供了三種方法:
(1)用類的長名稱(即包名+類名)引用。
如果某個類只訪問一次,那么可以自接使用類的全名,形式是“包名.類名”。
例:com.sxx.jsj包中的Graphic類,它的全名為com.sxx.jsj.Graphic。
class MyPict{
com.sxx.jsj.Graphic gpc=new com.sxx .jsj .Graphic (?搖 ?搖);
…
}
這種方式適合一次或者兩次的使用原則,如果必須一次又一次地寫com.sxx.jsj.Graphic,那這種方法太麻煩。
(2)利用import語句導入包中的某個類(此時import語句必須放置在程序的開頭,如果有package語句,則放在他的后面);
例:訪問com.sxx.jsj包中的Graphic類。
import com.sxx.jsj.Graphic;
Class MyPict{
Graphic gpc=new Graphic(?搖?搖);
…
}
這種方式適合使用包中幾個類,但是如果要使用一個包中的許多類和接口,那么可以導入整個包。
(3)利用import語句導入整個包中的所有類。
方法:import包名.*;(“*”表示包中的所有公共類)。
例:com.sxx.jsj包有很多類(包括Graphic,Circle,Rectangle類等)。
import com .sxx.jsj.*;
class MyPict{
Graphic gpc=new Graphic(?搖?搖);
Circle cir1=new Circle(?搖?搖);
Rectangle rec1=new Rectangle(?搖?搖);
…}
導入包時注意事項:(1)如果要導入的類與現在使用的類名相同則默認使用本地類。(2)如果要導入的類與正在使用的類名相同,但此時必須使用這個導入類,在不影響本地類的情況下,利用類的全名(即包名.類名)使用。
2.4.2使用包的好處
(1)消除名稱的二義性。
(2)在開發大型項目時,很容易讓程序員知道類和接口的相關性。
(3)可以允許包中的類較自由地訪問包中的另一個類,同時嚴格地限制包外的類對包內的類的訪問。
2.5設置包的路徑
classpath指明包的根目錄。Java編譯器會嚴格按classpath和包名所指定的路徑尋找包,進而使用其中的某個類。(注意:路徑名稱中不能有空格)
查看和設置classpath環境變量的方法有兩種:(1)命令行窗口中使用setclasspath命令,格式:set classpath=%classpath%;c:\\javatest,特點是命令行窗口一關閉就無效;(2)通過用鼠標右擊【我的電腦】圖標,在彈出的快捷菜單中,選擇【屬性】命令,彈出【系統特性】對話框,再單擊【高級】選項卡,然后選擇【環境變量】按鈕,就可以在系統變量中新建classpath屬性,變量名:classpath,變量值:%classpath%;c:\\javatest,特點是對命令行窗口始終有效。
3.結語
包是Java體系架構中個很重要的概念,它在物理上起到了組織文件、管理文件的作用,在邏輯上是對類和接口進行了訪問權限的管理,實現了類和接口的一定程度的封裝作用。正確合理地創建包和使用包會使開發的軟件更健壯、更易于維護。
參考文獻:
[1]楊年華,張禮平.JAVA類庫中的策略模式[J].計算機應用與軟件,2004,(01).
[2]耿祥義,張躍平.Java程序設計(第三版)[M].北京:清華大學出版,2009.
[3][美]Bruce Eckela著.京京工作室譯.JAVA編程思想[M].機械工業出版社,1999.4.
[4]劉曉華.精通Java核心技術[M].電子工業出版社,2004.