Java引入包(package)機制,提供了類的多層命名空間,用於解決類的命名沖突、類文件管理等問題。
Java允許將一組功能相關的類放在同一個package下,從而組成邏輯上的類庫單元。如果希望把一個類放在指定的包結構下,我應該在Java源程序的第一個非注釋行放置如下格式的代碼:
package packagename;
一旦在Java源文件中使用了這個package語句,就意味着該源文件里定義的所有類都屬於這個包。位於包中的每個類的完整類名都應該是包名和類名的組合,如果其他人需要使用該包下的類,也應該使用包名加類名的組合。
javac -d . Hello.java 與 javac Hello.java 的區別?
package lee;
public class Hello
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
-d選項本來用於設置編譯生成的class文件的保存位置,這里指定將生成的class文件放在當前路徑下。使用該命令編譯后,當前路徑下生成一個名為lee的文件夾,該文件夾下則有一個Hello.class文件。
如果直接使用javac Hello.java命令編譯,將會在當前路徑下生成一個Hello.class文件,而不會生成lee文件夾。
同一個包中的類必須位於同一個文件夾嗎?
可以不在同一個文件夾。例如lee.Person和lee.PersonTest兩個類可一個在C盤一個在D盤,只要讓CLASSPATH環境變量包含這兩個路徑即可。
包名如何起?
包名一般全是小寫字母,由一個或多個有意義的單詞連綴而成。為了在開發中避免包名和類名同時重復的情況,Oracle建議使用公司Internet域名倒寫來作為包名,例如Internet域名是crazyit.org,則該公司的所有類都放在org.crazyit包及其子包下。
域名倒寫.項目名.模塊名.組件名
同一個包下的類互相訪問時可以不加包前綴嗎?
可以。
父包和子包互相訪問時可以不加包前綴嗎?
不可以,必須加包前綴。
import關鍵字
正如上面看到的,如果需要使用不同包中的其他類時,總是需要使用該類的全名,這是一件繁瑣的事情。為了簡化編程,Java引入了import關鍵字,import關鍵字可以向某個java文件只能給導入指定包層次下的某個類或全部類,import語句應該出現在package語句之后、類定義之前。一個Java源文件只能包含一個package語句,但可以包含多個import語句,多個import語句用於導入多個包層次下的類。
導入單個類:import package.subpackage...ClassName;
導入全部類:import package.subpackage...*;
上面的(*)只能代表類,不能代表包。
Java的常用包
Java的核心類都放在java這個包及其子包下,Java擴展的許多類都放在javax包及其子包之下。這些實用類也就是前面所說的API(應用程序接口),Oracle按這些類的功能分別放在不同的包下。下面幾個包是Java中的常用包。
java.lang:這個包下包含了Java語言的核心類,如Sting、Math、System、和Tread類等,使用這個包下的類無需使用import語句導入,系統會自動導入這個包下的所有類。
java.util:這個包下包含了Java的大量工具類/接口和集合框架類/接口,例如Arrays和List、Set等。
java.net:這個包下包含了一些Java網絡編程相關的類/接口。
java.io:這個包下包含了一些Java輸入/輸出相關的類/接口。
java.text:這個包下包含了一些Java格式化相關的類。
java.sql:這個包下包含了一些Java進行JDBC數據庫編程相關的類/接口。
java.awt:這個包下包含了抽象窗口工具集(Abstract Window Toolkits)的相關類/接口,這些類主要用於構建圖形用戶界面(GUI)程序。
java.swing:這個包下包含了Swing圖形用戶界面編程的相關類/接口,這些類可用於構建平台無關的CUI程序。