Java SE 6 技術手冊

3.1 第一個 Java 程式

先來解釋一下第 2 章中您所完成的「第一個 Java 程式」,如果您學過 C 語言,對於 3.1.2「給 C 使用者的第一個 Java 程式」可能會覺得比較親切,因為介紹了類似 C 語言中 printf() 函式的功能,另外別忘了在寫程式時加入一些註解文字,這在閱讀程式碼的時候會很有幫助。

3.1.1 解釋第一個 Java 程式

要對新手解釋第一個 Java 程式事實上並不簡單,因為一個最簡單的 Java 程式就會涉及檔案管理、類別 (Class)、主程式、命令列引數(Command line argument)等觀念,我很想對您說,反正一個基本的 Java 程式就這麼寫就對了,因為要一下子接受這麼多觀念並不容易。總之,如果現階段您無法瞭解,就請當它是 Java 語言的文法規範。

先重新列出您的第一個 Java 程式以方便說明。

範例 3.1 HelloJava.java

public class HelloJava {
    public static void main(String[] args) {
        System.out.println("嗨!我的第一個Java程式!");
    }
}
  • 定義類別(Class)

    撰寫 Java 程式通常都是由定義「類別」開始,"class" 是 Java 用來定義類別的關鍵字,範例中類別的名稱是 HelloJava,這與您編輯的檔案(HelloJava.java)主檔名必須相同,HelloJava 類別使用關鍵字 "public" 宣告,在編寫 Java 程式時,一個檔案中可撰寫數個類別,但是只能有一個公開(public)類別,而且檔案主檔名必須與這個公開類別的名稱相同,在定義類別名稱時,建議將類別首字母大寫,並在類別名稱上表明類別的作用。

  • 定義區塊(Block)

    在 Java 程式使用大括號 '{' 與 '}'來定義區塊,大括號兩兩成對,目的在區別定義的作用範圍,例如您的程式中,HelloJava 類別的區塊包括了 main(),而 main() 的區塊包括了一句顯示訊息的程式碼。

  • 定義 main() 方法(Method)

    main() 是 Java 程式的「進入點」(Entry point),程式的執行是由進入點開始的,類別中的方法是類別的成員(Member),main() 方法一定是個 "public" 成員(member),這樣它才可以執行環境被呼叫;main() 方法不需要產生物件(Object)就能被執行,所以它必須是個 "static" 成員,"public" 與 "static" 的觀念都是 Java 物件導向(Object-oriented)程式上的觀念,之後專門討論類別與物件時會再介紹,這邊先不用理解 "public" 與 "static" 的真正意涵。

    main() 之前的「void」表示 main() 執行結束後不傳回任何值,Java 程式的 main() 方法不需傳回任何值,所以一律宣告 void;main() 括號間的 String[] args 可以在執行程式時取得使用者指定的命令列引數(Command line argument),目前雖然您用不到,但仍要撰寫它,這是規定。

  • 撰寫陳述(Statement)

    來看 main() 當中的一行陳述:

    System.out.println("嗨!我的第一個Java程式!");

    陳述是程式語言中的一行指令,簡單的話就是程式語言的「一句話」。注意每一句陳述的結束要用分號 ' ; ' ,在上面的陳述中,您使用了 java.lang 套件(package)下的 System 類別的公開(public)成員 out 物件,out 是一個 PrintStream 物件,您使用了 PrintStream 所提供的 println() 方法,將當中指定的字串(String) "嗨!我的第一個Java程式!" 輸出至文字模式上。

    注意在 Java 中字串要使用 "" 包括,println() 表示輸出字串後自動換行,如果使用 print() 的話,則輸出字串後程式並不會自動斷行。

一個最基本的 Java 程式完成了,接下來要編譯程式了,關於編譯在第 2 章中有介紹過,這邊再作個提示,編譯時是使用 javac 公用程式,如下所示:

javac HelloJava.java

編譯完成後,預設在同一個目錄下會產生一個 HelloJava.class 的位元碼(bytecodes)檔案,在執行時期可以由執行環境轉換為平台可執行的機器碼,執行程式時是使用 java 工具程式,如下所示:

java HelloJava

注意最後並沒有加上 *.class 的副檔名,您只要提供類別名稱就可以了,程式畫面會顯示如下:

嗨!我的第一個Java程式!

良葛格的話匣子 定義區塊的風格因人而異,有的設計人員習慣先換行再定義區塊,例如:

public class HelloJava 
{
    public static void main(String[] args) 
    {
        System.out.println("嗨!我的第一個Java程式!");
    }
}
這麼作的好處是可以很快的找到兩兩成對的大話號,區塊對應清楚。找一個您喜歡的風格撰寫,以清晰易讀為原則就可以了。

3.1.2 給 C 使用者的第一個 Java 程式

學過 C 語言的設計人員總是對 printf() 方法的功能總是難以忘懷,他們在學 Java 語言時常不免感概:「是的!是 printf(),他們忘了把 printf() 放進去了....」。

在某些時候,printf() 方法中字串上可以指定引數來進行輸出的功能確實令人難以割捨,幸好,Java 在 J2SE 5.0 這個版本中,總算給了 C 使用者類似 printf() 的功能了,如果您是學過 C 的使用者,下面這第一個 Java 程式或許會讓您高興一些:

範例 3.2 HelloJavaForC.java

public class HelloJavaForC {
    public static void main(String[] args) {
        System.out.printf("%s! 這是您的第一個Java程式!\n", 
                          "C語言Fan");
    }
}

這次使用的是 out 物件的 printf() 方法,'%s' 對應於第一個字串 "C語言Fan",程式的輸出會是如下:

C語言Fan! 這是您的第一個Java程式!

'\n' 對 C 程式設計人員並不陌生,它是換行字元,您也可以如下使用 println() 進行換行。

範例 3.3 SecondJavaForC.java

public class SecondJavaForC {
    public static void main(String[] args) {
        System.out.printf("%s! 這是您的第二個Java程式!", 
                          "C語言Fan").println();
    }
}

程式的輸出會是如下:

C語言Fan! 這是您的第二個Java程式!

在 printf() 要指定數字對應的話,可以使用 '%d',例如:

範例 3.4 ThirdJavaForC.java

public class ThirdJavaForC {
    public static void main(String[] args) {
        System.out.printf("%s! 這是您的第 %d 個Java程式!\n", 
                          "C語言Fan", 3);
    }
}

'%s' 對應至 "C語言Fan",而 '%d' 對應至數字 3,所以程式的輸出會是如下:

C語言Fan! 這是您的第 3 個Java程式!

這邊再作一次提醒,printf() 方法是在 J2SE 5.0 之後才有的功能,1.4 或更早版本的 JDK 並沒有辦法編譯範例 3.2、3.3 與 3.4。

良葛格的話匣子 如果您安裝的是 JDK6,即使您沒有使用到 JDK6 的新功能,所編譯出來的 class 檔預設也是無法在更早版本的 JRE 上運行的,因為 JDK6 編譯出來的 class 檔版號跟較早版本的JVM所接受的版號並不相同。

在不使用 JDK6 的新功能下,如果您希望編譯出來的 class 可以在 1.5 版本或之前版本上的環境上運行,則編譯時必須指定 -source 與 -target 引數,-source 指定原始碼中可以使用的版本功能,-target 指定編譯出來的位元碼適用的虛擬機器版本,例如您想要編譯出來的檔案在 1.5 版本環境上運行的話,可以如下編譯程式:

javac -source 1.5 -target 1.5 HelloJava.java

3.1.3 為程式加入註解

在撰寫程式的同時,您可以為程式碼加上一些註解(Comment),說明或記錄您的程式中一些要注意的事項,Java 語言是您用來與電腦溝通的語言,而註解的作用則是與開發人員溝通。

原始碼檔案中被標註為註解的文字,編譯器不會去處理它,所以註解文字中撰寫任何的東西,對編譯出來的程式不會有任何影響。在 Java 中可以用兩種方式為程式加上註解,以範例 3.4 為例,您可以為它加上一些註解文字,例如:

/* 作者:良葛格
 * 功能:示範printf()方法
 * 日期:2005/4/30
 */
public class ThirdJavaForC {
    public static void main(String[] args) {
        // printf() 是J2SE 5.0的新功能,必須安裝JDK 5.0才能編譯
        System.out.printf("%s! 這是您的第 %d 個Java程式!\n", 
                          "C語言Fan", 3);
    }
}

'/' 與 '/' 用來包括跨行的註解文字,通常開發人員為了讓註解文字看來比較整齊清晰,中間還會使用一些 '' 來排版,只要記得使用多行註解時,是以 '/' 開始註解文字,以 '*/' 結束註解文字,所以您不能用巢狀方式來撰寫多行註解,例如下面的方式是不對的:

/*  註解文字1……bla…bla
    /*
        註解文字2……bla…bla
    */
*/

編譯器在處理前面的撰寫方式時,會以為倒數第二個 '/' 就是註解結束的時候,因而對最後一個 '/' 就會認為是錯誤的符號,這時就會出現編譯錯誤的訊息。

'//' 則可以用來撰寫單行註解,在 '//' 之後的該行文字都被視為註解文字,多行註解可以包括單行註解,例如:

/*  註解文字1……bla…bla
        // 註解文字2……bla…bla
*/

註解的撰寫時機與內容並沒什麼特別的規定,以清晰易懂為主,註解的目的在於說明程式,是給開發人員看的,您可以使用註解在程式中寫下重要事項,日後作為備忘或是方便其他開發人員瞭解您的程式內容。

註解的另一個作用則是用來暫時註銷某些陳述句,當您覺得程式中某些陳述有問題,可以使用註解標示起來,如此編譯器就不會去處理,例如同樣以範例 3.4 為例:

public class ThirdJavaForC {
    public static void main(String[] args) {
        // System.out.println("C語言Fan!這是您的第3個Java程式!");
        System.out.printf("%s! 這是您的第 %d 個Java程式!\n", 
                          "C語言Fan", 3);
    }
}

在'//'之後的內容被視為註解文字,編譯器不會去處理,所以執行時不會執行該行陳述,如果日後要重新恢復那些陳述句的功能,只要將註解符號消去就可以了。# 第一個 Java 程式