Java 包(package)詳解
(轉自:http://c.biancheng.net/view/940.html)
1.什么情況下需要包?
隨着程序架構越來越大,類的個數也越來越多,管理程序中維護類名稱也是一件很麻煩的事,尤其是一些同名問題的發生。有時,開發人員還可能需要將處理同一方面的問題的類放在同一個目錄下,以便於管理。
為了解決上述問題,Java 引入了包(package)機制,提供了類的多層命名空間,用於解決類的命名沖突、類文件管理等問題。
2.包作用
包允許將類組合成較小的單元(類似文件夾),它基本上隱藏了類,並避免了名稱上的沖突。包允許在更廣泛的范圍內保護類、數據和方法。你可以在包內定義類,而在包外的代碼不能訪問該類。這使你的類相互之間有隱私,但不被其他世界所知。
包的 3 個作用如下:
- 區分相同名稱的類。
- 能夠較好地管理大量的類。
- 控制訪問范圍。
3.包定義
Java 中使用 package 語句定義包,package 語句應該放在源文件的第一行,在每個源文件中只能有一個包定義語句,並且 package 語句適用於所有類型(類、接口、枚舉和注釋)的文件。定義包語法格式如下:
package 包名;
Java 包的命名規則如下:
- 包名全部由小寫字母(多個單詞也全部小寫)。
- 如果包名包含多個層次,每個層次用“.”分割。
- 包名一般由倒置的域名開頭,比如 com.baidu,不要有 www。
- 自定義包不能 java 開頭。
注意:如果在源文件中沒有定義包,那么類、接口、枚舉和注釋類型文件將會被放進一個無名的包中,也稱為默認包。在實際企業開發中,通常不會把類定義在默認包下。
4.包導入
如果使用不同包中的其它類,需要使用該類的全名(包名+類名)。代碼如下:
example.Test test = new example.Test();
其中,example 是包名,Test 是包中的類名,test 是類的對象。
為了簡化編程,Java 引入了 import 關鍵字,import 可以向某個 Java 文件中導入指定包層次下的某個類或全部類。import 語句位於 package 語句之后,類定義之前。一個 Java 源文件只能包含一個 package 語句,但可以包含多個 import 語句。
使用 import 導入單個類的語法格式如下:
import 包名+類名;
上面語句用於直接導入指定類,例如導入前面的 example.Test 類,代碼如下:
import example.Test;
使用 import 語句導入指定包下全部類的用法按如下:
import example.*;
上面 import 語句中的星號(*)只能代表類,不能代表包,表明導入 example 包下的所有類。
提示:使用星號(*)可能會增加編譯時間,特別是引入多個大包時,所以明確的導入你想要用到的類是一個好方法,需要注意的是使用星號對運行時間和類的大小沒有影響。
通過使用 import 語句可以簡化編程,但 import 語句並不是必需的,如果在類里使用其它類的全名,可以不使用 import 語句。
Java 默認為所有源文件導入 java.lang 包下的所有類,因此前面在 Java 程序中使用 String、System 類時都無須使用 import 語句來導入這些類。但對於前面介紹數組時提到的 Arrays 類,其位於 java.util 包下,則必須使用 import 語句來導入該類。
在一些極端的情況下,import 語句也幫不了我們,此時只能在源文件中使用類全名。例如,需要在程序中使用 java.sql 包下的類,也需要使用 java.util 包下的類,則可以使用如下兩行 import 語句:
import java.util.*;
import java.sql.*;
如果接下來在程序中需要使用 Date 類,則會引起如下編譯錯誤:
Test.java:25:對Date的引用不明確,
java.sql中的類java.sql.Date和java.util中的類java.util.Date都匹配
上面錯誤提示:在 Test.java 文件的第 25 行使用了 Date 類,而 import 語句導入的 java.sql 和 java.util 包下都包含了 Date 類,系統不知道使用哪個包下的 Date 類。在這種情況下,如果需要指定包下的 Date 類,則只能使用該類的全名,代碼如下:
// 為了讓引用更加明確,即使使用了 import 語句,也還是需要使用類的全名
java.sql.Date d = new java.sql.Date();
5.系統包
Java SE 提供了一些系統包,其中包含了 Java 開發中常用的基礎類。在 Java 語言中,開發人員可以自定義包,也可以使用系統包,常用的系統包如表 1 所示。
表1 Java中常用的系統包 |
|
包 |
說明 |
java.lang |
Java 的核心類庫,包含運行 Java 程序必不可少的系統類,如基本數據類型、基本數學函數、 |
java.io |
Java 語言的標准輸入/輸出類庫,如基本輸入/輸出流、文件輸入/輸出、過濾輸入/輸出流等 |
java.util |
包含如處理時間的 Date 類,處理動態數組的 Vector 類,以及 Stack 和 HashTable 類 |
java.awt |
構建圖形用戶界面(GUI)的類庫,低級繪圖操作 Graphics 類、圖形界面組件和布局管理 |
java.awt.image |
處理和操縱來自網上的圖片的 Java 工具類庫 |
java.wat.peer |
很少在程序中直接用到,使得同一個 Java 程序在不同的軟硬件平台上運行 |
java.net |
實現網絡功能的類庫有 Socket 類、ServerSocket 類 |
java.lang.reflect |
提供用於反射對象的工具 |
java.util.zip |
實現文件壓縮功能 |
java.awt.datatransfer |
處理數據傳輸的工具類,包括剪貼板、字符串發送器等 |
java.sql |
實現 JDBC 的類庫 |
java.rmi |
提供遠程連接與載入的支持 |
java. security |
提供安全性方面的有關支持 |
讀者現在只需對這些包有一個大致印象即可,隨着教程后面的介紹,讀者會逐漸熟悉它們的用法。
6.自定義包
包的聲明和使用非常簡單,在了解基本語法之后,下面通過一個案例演示在 Java 程序中聲明包,以及不同包之間類的使用。
1)創建一個名為 com.dao 的包。
2)向 com.dao 包中添加一個 Student 類,該類包含一個返回 String 類型數組的 GetAll() 方法。Student 類代碼如下:
- //創建包,包名為com.dao
- package com.dao;
- //添加名為Student的類
- public class Student {
- // 返回的方法名為GetAll()
- public static String[] GetAll() {
- String[] namelist = {"李潘","鄧國良","任玲玲","許月月","歐陽娜","趙曉慧"};
- return namelist;
- }
10. }
3)創建 com.test 包,在該包里創建帶 main() 方法的 Test 類。
4)在 main() 方法中遍歷 Student 類的 GetAll() 方法中的元素內容,在遍歷內容之前,使用 import 引入 com.dao 整個包。完整代碼如下:
- //創建包
- package com.test;
- //引入包
- import com.dao.Student;
- //創建類
- public class Test {
- public static void main(String[] args) {
- System.out.println("學生信息如下:");
- for(String str:Student.GetAll()) {
- 10. System.out.println(str);
- 11. }
- 12. }
13. }
5)運行上一步驟的代碼進行測試,最終的輸出結果如下:
學生信息如下:
李潘
鄧國良
任玲玲
許月月
歐陽娜
趙曉慧