## Java編程那些事兒72——包的概念
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
?
### 8.11 包的概念
隨著項目復雜度的增加,一個項目中需要實現的類和接口的數量也將快速增長,為了方便對于代碼的管理和閱讀,需要將這些類和接口按照一定的規則進行分類,這就是程序設計中命名空間(name space)概念出現的原因。
在Java語言中,為了對同一個項目中的多個類和接口進行分類和管理,專門設計了包(Package)的概念,使用包管理和類和接口。
其實出現包的概念最開始的原因是避免類名重復,現在這個作用也得到了廣泛的應用。例如各個公司會為同一個功能實現一套類,這些類名之間大量的存在重復,使用包的概念就可以很方便的解決類名重復的問題。
那么包到底是什么呢?其實包是一個邏輯的概念,就是給類名加了一個前綴,就像北京路這個路名上海和南京都有,再說這個路名時,就可以使用南京市北京路和上海市北京路進行區分,這里的北京路就相當于類,而前面的前綴,如南京市或上海市,就相當于包名。
在物理上包被轉換成一個文件夾,操作系統通過文件夾來管理各個類和接口,從而實現對類的分類,或者稱之為按照類的功能對這些類進行封裝。
下面介紹一下和包有關的兩個語法:打包和引入包。
#### 8.11.1 打包
打包的作用就是將聲明的類放入包中,也就是為類指定包名。在實際的項目中,一般根據類的功能來設定包,例如設置界面類包,邏輯類包,網絡類包等結構。
打包的語法格式為:
package包名1[.包名2[.包名3……]];
在該語法中,包名可以設置多個,包名和包名之間使用“.”進行分割,包名的個數沒有限制。其中前面的包名包含后面的包名。按照Java語言的編碼規范,包名所有字母都小寫,由于包名將轉換為文件夾的名稱,所以包名中不能包含特殊字符。
例如:
?????????????????? packagetest;
?????????????????? packagedemo.chapter8;
?????????????????? packagegame.bubble.ui;
在示例中的最后一個,package game.bubble.ui,該包名將轉換為路徑/game/bubble/ui,也就是前面的包名是后面包名的父目錄。
需要特別注意的是:
1、打包的語句必須是程序代碼中的第一行可執行代碼,也就是說打包語句的上面只能包含空行或注釋。
2、打包的語句最多只有一句。
如果在代碼中沒有書寫package語句,則該類將被打入到默認包中,默認包無法被其它的包引用。
示例代碼:
~~~
?????????????????? //文件名:PackageClass.java
?????????????????? packagechapter8;
?????????????????? publicclass PackageClass{
??????????????????????????? //類內部的代碼
?????????????????? }
~~~
通過打包語法,可以為每個類增加一個前綴,也就是說以前使用類,使用類名即可,有了包名的概念以后,類的全名就是包名.類名了,通過在類名前面加入包名,可以使不同包中存在系統的類名,但是一般不建議一個項目中的類名存在重復。
當一個類有了包名以后,在編譯和運行時將和前面的操作產生一些變化,下面介紹一下JDK和Eclipse中相關操作的變化。
a)JDK編譯和運行打包的源文件
編譯源代碼的命令:javac –d 類文件路徑源代碼名稱
例如:javac? –d? d:/?PackageClass.java
該命令的作用是將PackageClass類編譯成class,并將生成的class文件存儲到d盤根目錄下。則class文件的存儲路徑是:d:/chapter8/PackageClass.class。使用該命令編譯時自動將包名轉換為文件夾。
如果想將編譯生成的class文件生成在源代碼所在的目錄,則可以使用如下格式:javac–d . 源文件名
這里的源文件沒可以使用*.java代表當前目錄下的所有源文件。
說明:執行javac命令必須將目錄切換到源代碼所在的目錄。
運行類文件的格式: java 包名.類名
例如:java? chapter8.PackageClass
該命令的作用是運行該類,按照上面的編譯命令,運行該程序時,不應該切換到class文件所在的目錄,而是切換到最頂層的包名所在的目錄,所以執行以上命令時,在控制臺下面只需要切換到d盤根目錄即可。
b)eclipe編譯和運行打包的源代碼
在新建源代碼時,可以在新建類向導中,可以在package欄中添加包名,在eclipse編譯時會自動生成包名的結構。
運行帶包名的代碼也和以前的運行步驟一樣。
需要特別注意的是:在eclipse中,源代碼的組織也要求將包名轉換為文件夾,否則將出現語法錯誤,這點在復制代碼到eclipse項目中時需要特別小心。
#### 8.11.2 引入包
當類進行了打包操作以后,同一個包內部的類默認引入,當需要使用其它包中的類時,則必須首先引入對應的類,然后才可以使用該類。
引入包的語法格式為:
import包名1.[.包名2[.包名3……]].類名|*;
在該語法中,import關鍵字后面是包名,包名和包名之間使用“.”分割,最后為類名或“*”,如果書寫類名則代表只引入該類,如果書寫星號則代表引入該包中的所有類、接口、異常和錯誤等。
例如:
?????????????????? importchapter8.*;
?????????????????? importjava.io.*;
?????????????????? importchapter8. PackageClass;
引入包的代碼書寫在類聲明語句的上面,打包語句的下面,import語句在一個代碼中可以書寫任意多句,例如:
~~~
?????????????????? packagechapter8;
?????????????????? importjava.io.*;
?????????????????? importjava.net.*;
?????????????????? publicclass Test{
??????????????????????????? //其它代碼
?????????????????? }
~~~
說明:這里的java.io包和java.net包都是JDK中提供的包名。
每引入一個類或接口,將在內存中占有幾十個字節的空間,所以使用星號引入一個包中所有的類或接口雖然編寫起來比較簡單,但是卻浪費了一些內存,而一個一個的引入類名編寫起來又比較麻煩。
小提示:使用eclipse中的source菜單下的Orgnize Imports可以將星號的引用轉換為對類名的引用。
最后需要特別注意的是,import只引入當前包下面的類,而不引入該包下面的子包里面的類。例如:
~~~
???????? ???????? //文件名:A.java
?????????????????? packagea;
?????????????????? publicclass A{}
?
?????????????????? //文件名:B.java
?????????????????? packagea.b;
?????????????????? publicclass B{}
?
?????????????????? //文件名:Test.java
?????????????????? importa.*;
?????????????????? publicclass Test{
??????????????????????????? publicstatic void main(String[] args){
???????????????????????????????????? Bb = new B();?? //語法錯誤,B類未引入
??????????????????????????? }
?????????????????? }
~~~
說明:在該示例的Test類中,使用import a.*;引入了包a中的所有類,也就是類A,而包a的子包a.b中的類將不會被引入,所以在Test類中使用B類將出現語法錯誤。
#### 8.11.3 包的概念小結
總之,包的概念(也就是命名空間)使得類名沖突的問題獲得良好的解決,另外也可以使用包來分類管理一個項目中的多個類,使得項目中的類數量比較多時,結構顯得比較清晰。
到現在為止,綜合以前學習的所有語法知識,規范的類結構的代碼如下:
~~~
?????????????????? /*
?????????????????? ?*? 版權信息
?????????????????? ?*/
?????????????????? 打包語句
?????????????????? 引入語句
?????????????????? /**
?????????????????? ?* 類注釋
?????????????????? ?*/
?????????????????? 類聲明
~~~
JDK中的源代碼代碼(位置在JDK安裝目錄下的src.zip中)均以這樣的格式組織類,這也是規范編寫類結構代碼的基礎。
### 8.12 總結
面向對象(OO)是一種思想,該思想通過改變數據和功能的組織方式,從而徹底改變了整個項目中代碼的結構,也使得每個類的功能單純,從而極大的降低了項目的復雜度,使得項目開發更方便的進行模塊化,從而可以為開發更復雜的項目提供了機會。
本章雖然使用了不少的篇幅來介紹面向對象的知識,但是這些還只是一些基礎,更多的知識需要在實際的編程實踐中去進行體會。
當掌握了本章的知識以后,就可以比較輕松的去閱讀更專業的面向對象知識的書籍,比如面向對象理論以及設計模式相關的書籍,從而提高對于面向對象的認識。
面向對象的知識就介紹這么多,將在下一章中介紹JDK中類文檔的使用,并結合文檔的使用介紹如何使用JDK中提供的類,從而進入Java開發技術的學習。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結