瞭解Java的包機制
什麼叫包
在java中,所謂的包就是一個裝有多個類的容器,在一個包中,類的名稱是不能有相同的,但若兩個類在不同的包中,類名可相同。
包的作用
對於一個大型的軟體工程來說,所需要的類是非常多的,在起名,使用,管理的時候若都放在一個資料夾中,就會非常麻煩,首先就是起名問題,一般的大型工程都是多個程式設計師負責,每個程式設計師負責各自的模組,免不了命名衝突,另外管理的時候會很麻煩,難以區分每個類是幹哈的,對於後期維護帶來極大的不便。所以包就是解決此類問題誕生的。
使用
首先建立一個資料夾,在此命名為 demo,在 demo下新建一個 demo.java,一個 study.java,目錄是這樣
- demo
- demo.java
- study.java
在 demo.java 中輸入
package com;
public class demo{
public void say()
{
System.out.println("I am Groot!");
}
}
在 study.java 中輸入
package test; import com.demo; public class study{ public static void main(String[] args) { demo one = new demo(); one.say(); } }
然後編譯這兩個檔案,demo.java 在前,study.java 在後,因為 後者依賴前者。開啟 cmd 進入 demo 檔案下,然後輸入編譯命令,下面看下我的 cmd 面板
F:\java學習\demo>javac -encoding utf-8 -d f:/java學習/demo demo.java
編譯完成後你會發現 demo檔案下會生成一個 com 資料夾,裡面有一個 demo.class,說一下這個剛才輸入的命令,-encoding utf-8 是指定字符集為 " utf-8 " 防止中文亂碼, -d f:/java學習/demo 是指 將java 檔案編譯到何處,你可以看下 demo.java 檔案的 包宣告,該命令會根據 java檔案的包宣告在指定的目錄( 在此就是 f:/java學習/demo )建立合適的檔案結構,以對應包的宣告,在此你可以看出,包就是資料夾。現在檔案結構如下:
|—demo |—com |—demo.class |—demo.java |—study.java
然後編譯 study.java,輸入編譯命令,看下我的 cmd 面板
F:\java學習\demo>javac -encoding utf-8 -d f:/java學習/demo study.java
你會看到 demo 檔案下生成一個 test 資料夾,下面有一個 study.class 現在的檔案結構如下: |—demo |—com |—demo.class |—test |—study.class |—demo.java |—study.java 兩次編譯都通過後,下面開始執行,輸入 執行命令,看下我的 cmd 面板
F:\java學習\demo>java test/study
執行結果:
F:\java學習\demo>java test/study
I am Groot!
說明分析
下面仔細說下其中的流程,study.java 是怎麼載入 demo.java 這個類的。剛才已經強調,一定要先編譯被依賴的類,在此是 demo.java ,看下下面demo的包宣告程式碼:
package com;
宣告顯而易見,demo.java 這個類屬於 com 這個包,所以在編譯的過程中 用 javac -d 指定目錄,就會在指定目錄下生成一個 com 資料夾,下面是編譯後的 demo.class 二進位制檔案。如果 宣告 demo.java 的包為 com.test,就會在指定目錄下生成一個 com資料夾,在 com資料夾下生成一個 test資料夾,在 test資料夾下是 編譯後的二進位制檔案 demo.class。以次類推,-d 命令總會生成類對應的包結構(檔案結構)。上面說到 study.java 類依賴於 demo.java 類,下面說明下 study.java 是怎麼訪問到 demo.java 的,看下面這段 study.java 的程式碼:
package test;
import com.demo;
第一句是包的宣告,不多說,編譯的時候會建立 test資料夾,下面是編譯的二進位制檔案。看下 第二行,該行程式碼是引入 com包下的類 demo,在此引入的一定是編譯後的二進位制檔案即 demo.class,需要注意的是,在編譯 study.java 的時候,jvm虛擬機器會根據 import 語句引入後面的類,在此可以看下 study.java 中引入的類名路徑和 demo.class 檔案的路徑關係,顯而易見 在編譯 study.java 的時候,點 com資料夾一定要和 study.java 在同一目錄下,否則便不能編譯成功,剛才說了 包其實就是資料夾,import com.demo 就是引入 com資料夾下的 demo.class 檔案,編譯成功後,執行命令是這樣的:
F:\java學習\demo>java test/study
對於宣告包的類,執行的時候是 包名 + 類名,另外對於同一包下的類不需要 import 引入,可直接使用。
總結
感覺還是沒寫出來味道,建議四點:
1.引入其他自定義包中的類時候,在編譯前, import 語句後面的路徑一定要對應該類檔案同目錄下的依賴的二進位制檔案( .class)位置,不對應編譯會失敗。 2.可以不用 -d 命令指定編譯檔案放置的位置,但是要自行設定正確。 3.執行的時候,如果定義包的話,執行是 包名 + 類名,當然正確姿勢是這樣。 4.我建議在使用類的包的時候,首先在同一目錄下宣告 java檔案,由 javac -d 命令根據宣告生成編譯二進位制檔案放置的目錄。