Java中用package關鍵字定義一個包,下面通過幾個實驗,理解Java中的包的概念和作用。
實驗1:先看一個無包的情形
在G盤下新建一個Test.java,如圖1:
寫下面這些代碼
<span style="font-size:24px;">public class PackageTest{ public static void main(String args[]){ System.out.println("Hello World!"); } }</span>然后保存,然后打開控制台(win+R--輸入cmd--回車即可),輸入 G:--回車 進入G盤,輸入 javac PackageTest.java 編譯PackageTest.java,具體如下圖:
編譯成功之后,會發現與PackageTest.java同目錄下多了一個文---PackageTest.class,運行的時候執行的就是該文件,如下圖:
運行這個程序,在控制台輸入 java PackageTest ,運行結果如下:
這是沒有包的情形,下面看看有包的情形。
實驗2:
將實驗1中的G盤下的PackageTest.class文件刪除,打開PackageTest.java,在前面加上這些內容:
<span style="font-size:24px;">package p1.p2.p3; </span>
再在控制台輸入javac PackageTest.java編譯程序,如果沒有其他提示證明編譯成功,編譯結果如下:
同樣可以查看G盤下又多了一個PackageTest.class文件,用同樣的方法運行程序,在控制台輸入java PackageTest,結果是這樣的:
意思就是找不到PackageTest這個類,為什么呢?因為在PackageTest.java中定義了包。如何解決這個問題呢?
接下來,我們在G盤下新建一個文件夾p1,在p1下新建一個文件夾p2,在p2下新建一個文件p3,再把G盤下的PackageTest.class文件放到文件夾p3中,如下圖:
再在控制台運行這個程序,輸入java PackageTest,結果如下:
還是找不到這個類,為什么呢?因為這個類的名字不是PackageTest了,而是p1.p2.p3.PackageTest了,所以正確運行這個程序的方法是:
在控制台輸入 java p1.p2.p3.PackageTest 就能得到想要的結果了:
從上面的實驗可以看出:
1.包對.java源文件沒有作用,只對.class字節碼文件起作用。
2.包相當於一個字節碼的相對路徑。例如上例中PackageTest.class的絕對路徑就是:
G:\p1\p2\p3
引入包可以防止文件名之間的沖突(例如一個公司的網站域名為:www.abc.def.cn,則這個公司的程序員可以將所有的包設置為cn.def.abc)。