Java中帶包(建立及引用)的類的編譯
Java中帶包(建立及引用)的類的編譯
Java中帶包(建立及引用)的類的編譯與除錯
java源程式的編譯大家都知道,也就是cmd中到原始檔所在目錄下javac **.java即可,當程式中有包宣告還能簡簡單單的直接javac **.java嗎?答案當然是no,下面舉個簡單的例子證明一下直接javac **.java會怎麼樣。
如下:F:\javaweb2班\20160531目錄下有A.java檔案,注意原始檔中有包宣告
package mypack; public class A { String name; int age; public void setName(String _name){ this.name =_name; } public void setAge(int _age){ this.age = _age; } public String getName(){ return this.name; } public int getAge(){ return this.age; } public static void main(String[] args){ A a = new A(); //a.setName("zs"); a.name="zs"; a.setAge(18); System.out.println(a.getName()+a.getAge()); } }
現在對A.java直接進行編譯javac A.java結果如下:
我們可以清楚地看到當前目錄下出現了A.class位元組碼檔案,就這樣能不能直接執行呢?試試吧!
出現了這樣的錯誤,原因是我們在A.java中有包宣告,當執行A.java原始檔時java虛擬機器首先會在A.java當前目錄尋找位元組碼檔案,雖然這下找到了,但是因為在A.java中有包宣告,java虛擬機器緊接著去包目錄下尋找有沒有A.class位元組碼檔案,這下找到了才能夠成功執行,不信我們做做實驗!(這裡我再教教大家怎麼編譯有包宣告的A.java,也就是打包編譯javac -d . A.java即可)
這下就打包編譯成功了,這時我們可以看到mypack目錄下出現了A.class檔案,下面試試執行吧
這時我們發現執行還是不能通過??這時為什麼呢?這裡是許多新手遇到的問題,在這裡大家必須謹記一點:Java命令的引數是“類的完整類名”,而不是“檔名”。
這個源程式的完整類名應該是mypack.A,因此應該這麼寫:java mypack.A
這下就可以成功執行了!
別急!!下面還有更精彩的!作為包的使用怎麼可能會不講解一下包的匯入建立編譯呢!
這次我們引入另外一個測試類Test.java,程式碼如下:
1 2 3 4 5 6 7 8 9 10 |
|
1 |
|
編譯執行如下:
結果意料之中肯定是能夠編譯執行的,執行流程是這樣的:Test.java編譯之後生成的位元組碼檔案在當前目錄(編譯時他會尋找mypack中是否有A.class檔案,若無,編譯不通過),執行時,由於Test.java中沒有包宣告,java虛擬機器首先在當前目錄找到Test.class就會執行,執行到程式中引用到A類的地方,然後java虛擬機器在當前目錄看是否有A.class位元組碼檔案,這時即使發現了也會根據源程式中的包匯入進入包中尋找A.class,找到才能執行成功(其實在編譯階段就已經尋找了!)
下面更進一步:若我們給測試類Test.java加上包宣告package mypack1;
這時我們對Test.java進行打包編譯,這裡我又要給大家講解兩個知識點:1.打包編譯時,會自動建立包目錄,不需要自己新建包名資料夾;2.噹噹前目錄有多個java檔案需要編譯或打包編譯時,javac -d . *.java指令可以給當前目錄下的所有java檔案根據程式中是否有包宣告進行編譯或打包編譯
這時我們又該如何執行Test.java檔案呢?java Test.java嗎??顯然這樣是不行的,還記得我前面講過的麼:Java命令的引數是“類的完整類名”,而不是“檔名”。
因此我們需要這樣執行:
這樣就
上面講的這些都是一般情況,也就是類路徑都是在當前目錄下,當類路徑不在當前目錄下是否還能執行呢?又該如果執行呢?
如下圖我把Test.java放到外面一層目錄,這時我們就需要自己設定classpath引數。例如:F:\javaweb2班>java -cp F:/javaweb2班/20160531 mypack1.java;或者在任意目錄下:java -cp F:/javaweb2班/20160531 mypack1.java
這樣就成功了!具體的執行流程大家自己分析體會吧!
總結一下:1.Java命令的引數是“類的完整類名”,而不是“檔名”。
2.打包編譯時,會自動建立包目錄,不需要自己新建包名資料夾。
3.噹噹前目錄有多個java檔案需要編譯或打包編譯時,javac -d . *.java指令可以給當前目錄下的所有java檔案根據程式中是否有包宣告進行編譯或打包編譯。
4.當類路徑不在當前目錄下時,需要用到java -cp ...如:java -cp F:/javaweb2班/20160531 mypack1.java。
5.要清楚java虛擬機器根據包宣告包匯入執行位元組碼檔案的流程。