第 2 章 初探 Java
本章提要 2-1 撰寫第一個 Java 程式 2-2 Java 程式的組成要素
2-1 撰寫第一個 Java 程式 要使用 Java 程式語言, 您必須先將依照 Java 語法撰寫的程式儲存在一個純文字檔案中。 再利用 Java 程式語言的編譯器轉譯程式, 將您所撰寫的 Java 程式轉譯成 Java 虛擬機器的機器碼, 也稱為 Byte Code。 然後再使用 Java 虛擬機器來執行轉譯出來的機器碼。 如果執行結果有問題, 就必須回頭修改程式, 再重複前面所描述的步驟。
撰寫第一個 Java 程式
2-1-1 用文字編輯器撰寫程式 要撰寫 Java 程式, 必須使用文字編輯器 (Text Editor), 像是 Windows 所內附的記事本, 或者是坊間一般流行的 UltraEdit 這類付費軟體來撰寫, 而不是使用 Word 這一類的文書處理軟體。 您也可以在網路上找到許多功能不錯、免費的文字編輯器, 像是 Crimson Editor、VIM 等等。
為什麼不能使用文書處理軟體 撰寫 Java 程式 像是 Word 之類的文書處理軟體, 由於必須記錄段落文字的樣式 (大小、顏色、字體) , 因此除了您鍵入的文字以外, 儲存檔案時還會儲存許多相關文字樣式的資訊, 而且預設會以其自訂的格式儲存文字與相關資訊。 Java 編譯器既不認得這些文書處理軟體的檔案格式, 也無法認得其中所儲存的相關資訊, 因此無法正確編譯程式, 所以請不要使用文書處理軟體來撰寫程式。
使用文字編輯器撰寫程式 請使用文字編輯器, 撰寫如下的程式: 並請儲存為 FirstJava.java 這樣的檔名。
2-1-2 編譯寫好的程式 撰寫好並儲存 FirstJava.java 這個程式檔後, 就可以利用 Java 編譯器來進行編譯。 請執行開始/所有程式/附屬應用程式/命令提示字元命令, 開啟命令提示字元視窗。 先利用 cd 指令切換到您儲存程式檔案的資料夾, 例如若 FirstJava.java 是儲存在 C 磁碟的 test 資料夾下, 就必須先執行以下的指令, 切換到該資料夾:
編譯寫好的程式 然後鍵入以下指令進行編譯: 如果編譯之後發現有錯誤, 請回過頭去檢查您所鍵入的程式, 看看是不是有甚麼地方打錯了? 如果還是有問題, 請參考『 2-1-4 撰寫 Java 程式的注意事項』一節, 仔細檢查的程式。
2-1-3 執行程式 一旦編譯完成, 沒有任何錯誤, 您就可以執行剛剛所撰寫的程式了。 請在您所開啟的命令提示字元視窗中, 鍵入以下指令執行剛剛編譯好的程式:
執行程式 以下就是編譯到執行的實際結果:
2-1-4 撰寫 Java 程式的注意事項 檔案名稱: 檔案名稱必須和第 1 行 public class 之後的 FirstJava 相符, 並且加上 .java 作為副檔名, 以標示這是一個 Java 程式。 因此, 儲存的檔案必須取名為 FirstJava.java, 如果取錯名字, 編譯的時候就會出現錯誤訊息。 例如, 剛剛的程式如果儲存在 First.java 中, 則編譯的結果如下:
撰寫 Java 程式的注意事項 錯誤訊息告訴您必須將程式儲存在一個名為 FirstJava.java 的檔案裡。
撰寫 Java 程式的注意事項 英文字大小寫不同: 全形與半形不同: Java 編譯器會視英文字母的大小寫為不同的字母。 舉例來說, 第 3 行一開頭的 System 不能寫為 system, 也不能寫為 SYSTEM, 否則編譯時一樣都會有錯誤訊息。 全形與半形不同: 在程式中必須使用半形的標點符號以及括號。 舉例來說,『{ 』就不能寫為『{』, 當然,『;』也不能使用全形的『;』。
撰寫 Java 程式的注意事項 執行時不需指定副檔名: 執行編譯好的程式時, 只需要指定主檔名, 也就是檔案名稱中 .java 之前的部分。 如果您連帶列出副檔名的話, 就會出現執行錯誤的狀況, 像是這樣:
撰寫 Java 程式的注意事項 另外, 執行時所指定的主檔名部分大小寫必須相符。 以本例來說, 主檔名必須和第 1 行 public class 之後的名稱一樣, 也就是 FirstJava, 如果您的大小寫不對, 執行就會發生錯誤, 例如:
撰寫 Java 程式的注意事項
撰寫 Java 程式的注意事項 無法執行 javac.exe 或是 java.exe: 這很可能是忘記設定環境變數 path 的值, 請參考附錄 C。
2-2 Java 程式的組成要素 區塊 (Block) Java 程式的起點--main 敘述 (Statement) 為程式加上註解 (Comment)
2-2-1 區塊 (Block) 再來看看剛剛所撰寫的 FirstJava 程式:
區塊 (Block) 程式中以一對大括號 { 與 } 括起來的部分稱為區塊 (Block), 區塊中可以包含其他的區塊, 像是第 1 ~ 5 行的區塊就包含了第 2 ~ 4 行的區塊。 在左大括號 (即 {) 左邊的文字代表的是該區塊的種類與名稱, 不同的區塊構成 Java 程式中的各種元素, 後續的章節會說明每一種區塊的意義。
區塊 (Block) 為了突顯出區塊, 並且方便辨識區塊的包含關係, 在撰寫程式時會把區塊的內容往右邊縮排 (Indent)。 舉例來說, 第 2 ~ 4 行的區塊因為是內含在第1 ~ 5 行的區塊內, 所以將整個區塊往右縮, 這樣在視覺上就可以清楚的區分出區塊間的關係。要注意的是, 這純粹是為了撰寫或閱讀程式時辨識上的方便, 而非必要的作法, 您也可以把相同的程式寫成這樣:
區塊 (Block) 一樣可以正常編譯執行。 至於縮排時要往右移多少空格, 則是憑個人喜好而定, 我們建議以 2 ~ 4 個空格最恰當。在本書中, 所有的程式都是以 2 個空格為縮排的間隔。
2-2-2 Java 程式的起點--main 在範例程式的區塊中, 有一個區塊是每一個 Java 程式都必須要有的, 就是第 2 ~ 4 行的區塊, 這個區塊稱為 main() 方法, 意思是說, 這個區塊構成了一個方法 (Method), 而 main 是這個方法的名字。 至於方法的意義, 會在第 8 章說明, 這裡只要先記住每一個 Java 程式都必須要有一個 main() 方法即可。
main() 方法的名稱 由於 Java 是英文字母大小寫不同, 因此要特別注意 main 是全部小寫。 除此之外, 第一行 public class 之後的名稱也會依據程式的目的不同而命名, 以適度說明程式的內容。
Java 程式的起點--main main() 方法是 Java 程式真正執行時的起點, 當 Java 程式執行時, 會從這個區塊內的程式開始循序執行, 直到這個區塊結束為止。 以 FirstJava.java 來說, main() 方法中只有一行程式, 這行程式的作用就是在螢幕上印出訊息。
Java 程式的起點--main 其中, 以一對雙引號 ("") 所括起來的內容就是要印出的訊息, 在本例中, 就是印出『這是我的第一個 Java 程式。』只要變化用雙引號括起來的內容, 就可以印出不同的訊息。 因此, 只要更改 main() 方法的內容, 程式的執行結果就會不同。 舉例來說, 我們可以修改 FirstJava.java 程式, 讓 main() 方法的內容更加豐富, 例如:
Java 程式的起點--main
Java 程式的起點--main 在 SecondJava.java 這個程式中, main() 方法內有 2 行程式, 分別印出兩段訊息。這樣, 程式就變成印出這 2 行訊息了。 從這一章開始, 範例程式都會依循和 FirstJava.java 相似的架構, 僅有內部的區塊, 也就是 main() 方法有所差別, 來執行不同的動作:
Java 程式的起點--main 除此之外, 第一行 public class 之後的名稱也會依據程式的目的不同而命名, 以適度說明程式的內容。
敘述 (Statement) 如果細部來看單一個區塊, 那麼每個區塊又是由一或多個敘述 (Statement) 所構成。 簡單的敘述是以分號 (;) 結尾, 其他的敘述則是以一個區塊作為結尾。以 SecondJava.java 為例, 在 main() 方法這個區塊中就有兩個敘述, 分別是:
敘述 (Statement) Java 程式基本上就是由敘述組合而成, 而程式在執行時就是以敘述為單元, 由上往下循序進行。
敘述結尾字元 要注意的是, 簡單的敘述是以分號為分隔, 同一個敘述可以分成多行撰寫, 和寫在同一行是一樣的效果。 多個簡單敘述也可以寫在同一行, 結果和每一個敘述單獨撰寫成一行相同。 舉例來說, 以下這個程式就和 SecondJava.java 意義完全相同, 只是斷行的方式不同而已:
敘述結尾字元 其中 3 、4 兩行就是原本的第 3 行 而 5 、6 兩行則是原本的第 4 行。
字符 (Token) 與空白符號(Whitespace) 例如 SecondJava.java 的第 3 行『System.out.println ("這是我所寫的第二個 Java 程式,");』就是由『System』、『.』、『out』、『.』、『println』、『(』、『" 這是我所寫的第二個 Java 程式,"』、『)』、『;』這些字符所組成。
字符 (Token) 與空白符號 (Whitespace) 舉例來說, 以下的程式雖然在 "println" 與 "(" 間加上了額外的空白, 但和SecondJava.java 的意義是相同的:
字符 (Token) 與空白符號 (Whitespace) 但是如果字符間不相隔開會造成混淆的話, 就一定得加上空白符號。 舉例來說, 第 2 行的 public、static、void 與 main 這 4 個字符中間若不以分隔字元隔開, 就變成 publicstaticvoidmain, Java 編譯器就會以為這是單一個字符了。
字符 (Token) 與空白符號 (Whitespace) 在 Java 中, 空白字元、斷行字元 (也就是按 [Enter] ) 以及定位字元 (也就是按 [Tab] ) 都可以作為空白符號, 您可依據實際的需求採用不同的方式。 之前曾經提過, 同一個敘述可以分成多行撰寫, 其實就是利用斷行字元當作空白符號。 換句話說, 同一敘述分成多行撰寫時並不能隨便斷行, 而必須以字符為界線。 像是以下這個程式編譯時就會有錯誤, 因為它把 println 這個字符斷開成兩行了:
字符 (Token) 與空白符號 (Whitespace)
分隔符號 (Separator) 要特別注意的是, "("、")"、"{"、"}"、"["、"]"、";"、","、"." 這些字符在 Java 中稱為分隔符號 (Separator 或 punctuator)。 它們除了可以將其之前與之後的字符隔開以外, 通常也代表了其後的字符 (如果是成對的分隔符號, 像是 "{" 與 "}", 則是指由這對分隔符號所包含的內容) 是其前面字符的附屬部分。
分隔符號 (Separator) 舉例來說, 在 SecondJava.java 中, main() 方法後面由 "{"、"}" 括起來的區塊就是 main() 方法的主體。
2-2-4 為程式加上註解 (Comment) 除了撰寫實際上會有所動作的敘述以外, 您也可以在程式中加上僅有說明用途的註解 (Comment)。 舉例來說, 以下的程式就加上了許多註解, 讓您可以更輕易的看懂程式的內容:
為程式加上註解 (Comment)
為程式加上註解 (Comment) 其中, // 字符開始往後一直到該行文字結束之前的內容都是註解。 當 Java 解譯器看到 "//" 字符後, 就會忽略其後的文字, 一直到下一行開始, 才會繼續轉譯程式的內容。 這種註解稱為單行註解 (End-Of-Line Comment)。
為程式加上註解 (Comment) 另外還有一種可以跨越多行的註解方式, 稱為傳統式註解 (Traditional Comment) 或是區塊式註解 (Block Comment)。 以成對的 /* 與 */ 來包含所要加入的註解說明, 例如:
為程式加上註解 (Comment)
為程式加上註解 (Comment) 第 1 ~ 4 行就是一個跨越 4 行的區塊式註解。 第 7 行則是一個僅在單一行內的區塊式註解。 要注意的是, 區塊式註解可以出現在程式中的任何位置, 但不能出現在字符內, 例如以下的程式在編譯時就會有錯誤:
為程式加上註解 (Comment) 因為在第 2 行中有一個區塊式註解出現在字符中, 這是錯誤的寫法。 註解是一項非必要、但強烈建議使用的工具。 尤其當程式很長或是邏輯比較複雜的時候, 加上適當的註解不但可以讓您自己在一段時間過後能夠知道撰寫程式時的想法, 如果程式往後要交給別的人修改, 那麼註解也是後繼者理解您程式的最佳機會。 總結來說, Java 程式是由字符組成敘述, 再由敘述組成區塊, 然後再由區塊組成整個程式。