1. 程式人生 > >Java中帶包(建立及引用)的類的編譯

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

import mypack.A;

public class Test{

    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());

    }

}<br><br>

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虛擬機器根據包宣告包匯入執行位元組碼檔案的流程。