|
| 1 | +第 3 章 語法入門 |
| 2 | +================ |
| 3 | + |
| 4 | +程式語言(Programming Language)本質上就是一個語言,語言的目的在於讓您與特定對象進行溝通,只不過程式語言的溝通對象是電腦。現在您學習的是 Java 語言,用 Java 寫程式的目的就是在告訴電腦,您希望它為您作哪些事,Java 既然是語言,就有其規定的語法,這個章節就是在學習基本的 Java 語法。 |
| 5 | + |
| 6 | +我建議初學者從文字模式學習如何操作程式,您在這個章節中將會學到:如何告訴電腦在命令模式下顯示訊息?什麼時候該等待您輸入資料(即 Console 互動)?程式中您要使用的資料有哪些(即資料型態)?您要用這些資料進行什麼樣的運算(即各種運算子的使用)?在某些情況滿足時下一步要作什麼?不滿足某些條件時又該作些什麼(即流程控制)? |
| 7 | + |
| 8 | +----------- |
| 9 | + |
| 10 | +3.1 第一個 Java 程式 |
| 11 | +-------------------- |
| 12 | + |
| 13 | +先來解釋一下第 2 章中您所完成的「第一個 Java 程式」,如果您學過 C 語言,對於 3.1.2「給 C 使用者的第一個 Java 程式」可能會覺得比較親切,因為介紹了類似 C 語言中 printf() 函式的功能,另外別忘了在寫程式時加入一些註解文字,這在閱讀程式碼的時候會很有幫助。 |
| 14 | + |
| 15 | +## 3.1.1 解釋第一個 Java 程式 # |
| 16 | + |
| 17 | +要對新手解釋第一個 Java 程式事實上並不簡單,因為一個最簡單的 Java 程式就會涉及檔案管理、類別 (Class)、主程式、命令列引數(Command line argument)等觀念,我很想對您說,反正一個基本的 Java 程式就這麼寫就對了,因為要一下子接受這麼多觀念並不容易。總之,如果現階段您無法瞭解,就請當它是 Java 語言的文法規範。 |
| 18 | + |
| 19 | +先重新列出您的第一個 Java 程式以方便說明。 |
| 20 | + |
| 21 | +#### **範例 3.1 HelloJava.java** |
| 22 | +```java |
| 23 | +public class HelloJava { |
| 24 | + public static void main(String[] args) { |
| 25 | + System.out.println("嗨!我的第一個Java程式!"); |
| 26 | + } |
| 27 | +} |
| 28 | +``` |
| 29 | + |
| 30 | +- 定義類別(Class) |
| 31 | + |
| 32 | + 撰寫 Java 程式通常都是由定義「類別」開始,"class" 是 Java 用來定義類別的關鍵字,範例中類別的名稱是 HelloJava,這與您編輯的檔案(HelloJava.java)主檔名必須相同,HelloJava 類別使用關鍵字 "public" 宣告,在編寫 Java 程式時,一個檔案中可撰寫數個類別,但是只能有一個公開(public)類別,而且檔案主檔名必須與這個公開類別的名稱相同,在定義類別名稱時,建議將類別首字母大寫,並在類別名稱上表明類別的作用。 |
| 33 | + |
| 34 | +- 定義區塊(Block) |
| 35 | + |
| 36 | + 在 Java 程式使用大括號 '{' 與 '}'來定義區塊,大括號兩兩成對,目的在區別定義的作用範圍,例如您的程式中,HelloJava 類別的區塊包括了 main(),而 main() 的區塊包括了一句顯示訊息的程式碼。 |
| 37 | + |
| 38 | +- 定義 main() 方法(Method) |
| 39 | + |
| 40 | + main() 是 Java 程式的「進入點」(Entry point),程式的執行是由進入點開始的,類別中的方法是類別的成員(Member),main() 方法一定是個 "public" 成員(member),這樣它才可以執行環境被呼叫;main() 方法不需要產生物件(Object)就能被執行,所以它必須是個 "static" 成員,"public" 與 "static" 的觀念都是 Java 物件導向(Object-oriented)程式上的觀念,之後專門討論類別與物件時會再介紹,這邊先不用理解 "public" 與 "static" 的真正意涵。 |
| 41 | + |
| 42 | + main() 之前的「void」表示 main() 執行結束後不傳回任何值,Java 程式的 main() 方法不需傳回任何值,所以一律宣告 void;main() 括號間的 String[] args 可以在執行程式時取得使用者指定的命令列引數(Command line argument),目前雖然您用不到,但仍要撰寫它,這是規定。 |
| 43 | + |
| 44 | +- 撰寫陳述(Statement) |
| 45 | + |
| 46 | + 來看 main() 當中的一行陳述: |
| 47 | + |
| 48 | + <pre>System.out.println("嗨!我的第一個Java程式!");</pre> |
| 49 | + |
| 50 | + 陳述是程式語言中的一行指令,簡單的話就是程式語言的「一句話」。注意每一句陳述的結束要用分號 ' ; ' ,在上面的陳述中,您使用了 java.lang 套件(package)下的 System 類別的公開(public)成員 out 物件,out 是一個 PrintStream 物件,您使用了 PrintStream 所提供的 println() 方法,將當中指定的字串(String) "嗨!我的第一個Java程式!" 輸出至文字模式上。 |
| 51 | + |
| 52 | + 注意在 Java 中字串要使用 "" 包括,println() 表示輸出字串後自動換行,如果使用 print() 的話,則輸出字串後程式並不會自動斷行。 |
| 53 | + |
| 54 | +一個最基本的 Java 程式完成了,接下來要編譯程式了,關於編譯在第 2 章中有介紹過,這邊再作個提示,編譯時是使用 javac 公用程式,如下所示: |
| 55 | + |
| 56 | + javac HelloJava.java |
| 57 | + |
| 58 | +編譯完成後,預設在同一個目錄下會產生一個 HelloJava.class 的位元碼(bytecodes)檔案,在執行時期可以由執行環境轉換為平台可執行的機器碼,執行程式時是使用 java 工具程式,如下所示: |
| 59 | + |
| 60 | + java HelloJava |
| 61 | + |
| 62 | +注意最後並沒有加上 *.class 的副檔名,您只要提供類別名稱就可以了,程式畫面會顯示如下: |
| 63 | + |
| 64 | + 嗨!我的第一個Java程式! |
| 65 | + |
| 66 | +> **良葛格的話匣子** 定義區塊的風格因人而異,有的設計人員習慣先換行再定義區塊,例如: |
| 67 | +> <pre> |
| 68 | +> public class HelloJava |
| 69 | +> { |
| 70 | +> public static void main(String[] args) |
| 71 | +> { |
| 72 | +> System.out.println("嗨!我的第一個Java程式!"); |
| 73 | +> } |
| 74 | +> }</pre> |
| 75 | +> 這麼作的好處是可以很快的找到兩兩成對的大話號,區塊對應清楚。找一個您喜歡的風格撰寫,以清晰易讀為原則就可以了。 |
| 76 | +
|
| 77 | +3.1.2 給 C 使用者的第一個 Java 程式 |
| 78 | +----------------------------------- |
| 79 | + |
| 80 | +學過 C 語言的設計人員總是對 printf() 方法的功能總是難以忘懷,他們在學 Java 語言時常不免感概:「是的!是 printf(),他們忘了把 printf() 放進去了....」。 |
| 81 | + |
| 82 | +在某些時候,printf() 方法中字串上可以指定引數來進行輸出的功能確實令人難以割捨,幸好,Java 在 J2SE 5.0 這個版本中,總算給了 C 使用者類似 printf() 的功能了,如果您是學過 C 的使用者,下面這第一個 Java 程式或許會讓您高興一些: |
| 83 | + |
| 84 | +#### **範例 3.2 HelloJavaForC.java** |
| 85 | +```java |
| 86 | +public class HelloJavaForC { |
| 87 | + public static void main(String[] args) { |
| 88 | + System.out.printf("%s! 這是您的第一個Java程式!\n", |
| 89 | + "C語言Fan"); |
| 90 | + } |
| 91 | +} |
| 92 | +``` |
| 93 | + |
| 94 | +這次使用的是 out 物件的 printf() 方法,'%s' 對應於第一個字串 "C語言Fan",程式的輸出會是如下: |
| 95 | + |
| 96 | + C語言Fan! 這是您的第一個Java程式! |
| 97 | + |
| 98 | +'\n' 對 C 程式設計人員並不陌生,它是換行字元,您也可以如下使用 println() 進行換行。 |
| 99 | + |
| 100 | +#### **範例 3.3 SecondJavaForC.java** |
| 101 | +```java |
| 102 | +public class SecondJavaForC { |
| 103 | + public static void main(String[] args) { |
| 104 | + System.out.printf("%s! 這是您的第二個Java程式!", |
| 105 | + "C語言Fan").println(); |
| 106 | + } |
| 107 | +} |
| 108 | +``` |
| 109 | + |
| 110 | +程式的輸出會是如下: |
| 111 | + |
| 112 | + C語言Fan! 這是您的第二個Java程式! |
| 113 | + |
| 114 | +在 printf() 要指定數字對應的話,可以使用 '%d',例如: |
| 115 | + |
| 116 | +#### **範例 3.4 ThirdJavaForC.java** |
| 117 | +```java |
| 118 | +public class ThirdJavaForC { |
| 119 | + public static void main(String[] args) { |
| 120 | + System.out.printf("%s! 這是您的第 %d 個Java程式!\n", |
| 121 | + "C語言Fan", 3); |
| 122 | + } |
| 123 | +} |
| 124 | + |
| 125 | +``` |
| 126 | + |
| 127 | +'%s' 對應至 "C語言Fan",而 '%d' 對應至數字 3,所以程式的輸出會是如下: |
| 128 | + |
| 129 | + C語言Fan! 這是您的第 3 個Java程式! |
| 130 | + |
| 131 | +這邊再作一次提醒,printf() 方法是在 J2SE 5.0 之後才有的功能,1.4 或更早版本的 JDK 並沒有辦法編譯範例 3.2、3.3 與 3.4。 |
| 132 | + |
| 133 | +> **良葛格的話匣子** 如果您安裝的是 JDK6,即使您沒有使用到 JDK6 的新功能,所編譯出來的 class 檔預設也是無法在更早版本的 JRE 上運行的,因為 JDK6 編譯出來的 class 檔版號跟較早版本的JVM所接受的版號並不相同。 |
| 134 | +> |
| 135 | +> 在不使用 JDK6 的新功能下,如果您希望編譯出來的 class 可以在 1.5 版本或之前版本上的環境上運行,則編譯時必須指定 -source 與 -target 引數,-source 指定原始碼中可以使用的版本功能,-target 指定編譯出來的位元碼適用的虛擬機器版本,例如您想要編譯出來的檔案在 1.5 版本環境上運行的話,可以如下編譯程式: |
| 136 | +> |
| 137 | +> <pre>javac -source 1.5 -target 1.5 HelloJava.java</pre> |
| 138 | +
|
| 139 | +3.1.3 為程式加入註解 |
| 140 | +-------------------- |
| 141 | + |
| 142 | +在撰寫程式的同時,您可以為程式碼加上一些註解(Comment),說明或記錄您的程式中一些要注意的事項,Java 語言是您用來與電腦溝通的語言,而註解的作用則是與開發人員溝通。 |
| 143 | + |
| 144 | +原始碼檔案中被標註為註解的文字,編譯器不會去處理它,所以註解文字中撰寫任何的東西,對編譯出來的程式不會有任何影響。在 Java 中可以用兩種方式為程式加上註解,以範例 3.4 為例,您可以為它加上一些註解文字,例如: |
| 145 | + |
| 146 | +```java |
| 147 | +/* 作者:良葛格 |
| 148 | + * 功能:示範printf()方法 |
| 149 | + * 日期:2005/4/30 |
| 150 | + */ |
| 151 | +public class ThirdJavaForC { |
| 152 | + public static void main(String[] args) { |
| 153 | + // printf() 是J2SE 5.0的新功能,必須安裝JDK 5.0才能編譯 |
| 154 | + System.out.printf("%s! 這是您的第 %d 個Java程式!\n", |
| 155 | + "C語言Fan", 3); |
| 156 | + } |
| 157 | +} |
| 158 | +``` |
| 159 | + |
| 160 | +'/*' 與 '*/' 用來包括跨行的註解文字,通常開發人員為了讓註解文字看來比較整齊清晰,中間還會使用一些 '*' 來排版,只要記得使用多行註解時,是以 '/*' 開始註解文字,以 '*/' 結束註解文字,所以您不能用巢狀方式來撰寫多行註解,例如下面的方式是不對的: |
| 161 | + |
| 162 | +<pre>/* 註解文字1……bla…bla |
| 163 | + /* |
| 164 | + 註解文字2……bla…bla |
| 165 | + */ |
| 166 | +*/</pre> |
| 167 | + |
| 168 | +編譯器在處理前面的撰寫方式時,會以為倒數第二個 '*/' 就是註解結束的時候,因而對最後一個 '*/' 就會認為是錯誤的符號,這時就會出現編譯錯誤的訊息。 |
| 169 | + |
| 170 | +'//' 則可以用來撰寫單行註解,在 '//' 之後的該行文字都被視為註解文字,多行註解可以包括單行註解,例如: |
| 171 | + |
| 172 | +<pre>/* 註解文字1……bla…bla |
| 173 | + // 註解文字2……bla…bla |
| 174 | +*/</pre> |
| 175 | + |
| 176 | +註解的撰寫時機與內容並沒什麼特別的規定,以清晰易懂為主,註解的目的在於說明程式,是給開發人員看的,您可以使用註解在程式中寫下重要事項,日後作為備忘或是方便其他開發人員瞭解您的程式內容。 |
| 177 | + |
| 178 | +註解的另一個作用則是用來暫時註銷某些陳述句,當您覺得程式中某些陳述有問題,可以使用註解標示起來,如此編譯器就不會去處理,例如同樣以範例 3.4 為例: |
| 179 | + |
| 180 | +```java |
| 181 | +public class ThirdJavaForC { |
| 182 | + public static void main(String[] args) { |
| 183 | + // System.out.println("C語言Fan!這是您的第3個Java程式!"); |
| 184 | + System.out.printf("%s! 這是您的第 %d 個Java程式!\n", |
| 185 | + "C語言Fan", 3); |
| 186 | + } |
| 187 | +} |
| 188 | +``` |
| 189 | + |
| 190 | +在'//'之後的內容被視為註解文字,編譯器不會去處理,所以執行時不會執行該行陳述,如果日後要重新恢復那些陳述句的功能,只要將註解符號消去就可以了。 |
| 191 | + |
| 192 | +3.2 在文字模式下與程式互動 |
| 193 | +-------------------------- |
| 194 | + |
| 195 | +待續 ... |
0 commit comments