爲了使類型更易於查找,避免命名衝突和訪問控制,我們應該使用包來對自己定義的類型進行管理。這裏說的類型可以是類、接口、枚舉和註解(枚舉和註解的內容會在後續教程中介紹)。使用包來管理我們的代碼,有以下幾個目的:
- 便於查找:將相似或相關的類型放在同一個包下,項目整體的結構更加清晰,同時也有助於自己和其他人在使用時可以輕鬆地找到對應的類型。
- 避免命名衝突:如果自己代碼中的類型與其他已經存在的類型同名,使用包來創建新的命名空間可以避免命名衝突。
- 訪問控制:對於使用public修飾的類型來說,在本包或其他包中都可以使用這個類型;對於沒有使用訪問修飾符的類型來說,則只能在本包中進行訪問,其他包中的類型則無法訪問。
1.包的命名規則
包的命名滿足以下規則:
- 包名建議全部小寫,以避免與類或接口的名稱衝突;
- 父包和子包之間使用點(.)隔開;
- 建議將公司的互聯網域名以逆序的形式作爲包名,例如某公司的域名爲example.xyz,則mypackage包的命名爲xyz.example.mypackage;
2.將類型放入包中
要想將一個類型放進包中,首先需要在源文件中使用package語句。package語句的語法是package關鍵字後面跟上這個類型所在的包。這條語句要放在源文件的開頭,例如:
package xyz.example.mypackage;
public class Demo {
...
}
如果沒有在源文件中添加package語句,這個類型就被放在一個默認包中。一般來說,不推薦使用默認包,建議將每一個自己定義的類型都放在對應的包中。
將一個類型放進包中不但要在源文件中使用package語句,還要將源文件放在與包名匹配的目錄中。例如,xyz.example.mypackage包中的源文件應該被放置在目錄xyz/example/mypackage中。
3.使用包中的類型
(1)使用完整的包名
在要使用的類型前加上完整的包名,就可以在程序中使用這個類型了,例如:
java.util.List<String> list = new java.util.ArrayList<>();
(2)導入類型
在每個類型前使用完整的包名顯然很繁瑣,更常用的方式是使用import語句。在import關鍵字後面跟上具體類型的完整路徑即可將該類型導入當前源文件。例如,上面的例子可以寫成:
import java.util.List;
import java.util.ArrayList;
...
List<String> list = new ArrayList<>();
(3)導入整個包
還可以使用import導入某個包下所有的類型。就像下面這樣:
import java.util.*;
需要注意的是,*代表該包下所有的類型,但不包括子包。如果要導入子包或子包中的類型,則需要另外的import語句。
(4)靜態導入
import語句不僅可以導入類型,還可以導入靜態方法和靜態域。例如,如果在源文件的頂部添加一條語句:
import static java.lang.System.out;
就可以使用System類的靜態方法和域,而不必加類名前綴:
out.println("Hello, World!");