# 流程控制 ###### tags: `java` ## 目錄 - [條件式](#條件式) - [if](#if) - [switch](#switch) - [迴圈](#迴圈) - [for](#for) - [foreach](#foreach) - [while](#while) - [do...while](#do...while) - [break、continue](#break、continue) - [label](#label) - [方法](#方法) ## 條件式 現實生活不會一成不變,程式也是一樣,會根據不同情況有不一樣的結果,例如:「如果」什麼什麼發生了,就怎麼做;「對於」某些情況,就一直執行;「如果」情況出現,就「中斷」執行。 為了告訴電腦在特定條件下該執行的動作,會使用各種條件式來決定程式執行的流程。 ### if 為了根據不同情況執行不同程式碼,Java提供了if條件式 ,語法如下: ``` if(條件式) 陳述句一; else 陳述句二; ``` 解說:當「條件式」成立時(true),則執行「陳述句一」,要不然(else)就執行「陳述句二」;如果條件式不成立時並不想作任何事,則 else 可以省略。 在 if 後如果有兩個以上陳述句,稱之為「複合陳述句」(Compound statement),此時必須使用 { } 定義區塊(Block)將複合陳述句包括起來,例如: ``` if(條件式) { 陳述句一; 陳述句二; } else { 陳述句三; 陳述句四; } ``` 使用if條件式來判斷使用者的輸入是奇數還是偶數: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("請輸入數字: "); int input = Integer.parseInt(br.readLine()); int remain = input % 2; // 求除 2 的餘數 if(remain == 1) // 如果餘數為1 System.out.println(input + "為奇數"); else System.out.println(input + "為偶數"); } } ``` 在 if 中您也可以再設定執行的條件,例如: ``` if(條件式一) { 陳述句一; if(條件式二) 陳述句二; 陳述句三; } ``` 這只個簡單的例子,其中陳述句二要執行,必須同時滿足「條件式一」與「條件式二」才行;再來看個例子: ``` if(條件式一) { 陳述句一; // 其它陳述句 } else if(條件式二) 陳述句二; ``` 如果「條件式一」不滿足,就會執行 else 中的陳述,而您在這邊進行「條件式二」的測試,如果滿足就執行「陳述句二」,由於 Java 是個自由格式語言,您可以適當的排列這個程式,這會比較好懂一些: ``` if(條件式一) { 陳述句一; // 其它陳述句 } else if(條件式二) 陳述句二; ``` 基於這個方式,您可以如下設定多個條件,且易讀易懂: ``` if(條件式一) 陳述一; else if(條件式二) 陳述句二; else if(條件式三) 陳述句三; else 陳述句四; ``` 「陳述句四」會在條件式一、二、三都不成立時執行。 **範例:**處理學生的成績等級問題: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("輸入分數:"); int score = Integer.parseInt(br.readLine()); if(score >= 90) System.out.println("得A"); else if(score >= 80 && score < 90) System.out.println("得B"); else if(score >= 70 && score < 80) System.out.println("得C"); else if(score >= 60 && score < 70) System.out.println("得D"); else System.out.println("得E(不及格)"); } } ``` 執行結果如下: ``` 輸入分數:88 得B ``` 在這邊要注意的是 if 與 else 的配對問題,例如以下程式依縮排來看,您覺得有無問題存在? ``` if(條件式一) if(條件式二) 陳述句一; else 陳述句二; ``` 很多人都會以為「條件式二」的 if 會與 else 配對,但事實上是「條件式一」的 if 與 else 配對,加上括號的話就不會誤會了: ``` if(條件式一) { if(條件式二) 陳述句一; else 陳述句二; } ``` 如果想避免這種錯誤,在程式中多使用括號是必要的,多寫一些總是比少寫一些來得保險一點。 注意到了嗎?在撰寫程式時適當的使用縮排(Indent),可以在定義程式區塊時讓區塊範圍看來容易分辨。 **練習** 1. 寫一個猜拳遊戲: ``` import java.io.BufferedReader; import java.io.InputStreamReader; public class App { public static void main(String[] argc) throws Exception { final int scissors = 0; final int stone = 1; final int paper = 2; // 電腦出拳 0=剪刀, 1=石頭, 2=布 int pc = (int)(Math.random() * 3); // 測試用 if(pc == scissors) System.out.println("電腦出了剪刀"); else if(pc == stone) System.out.println("電腦出了石頭"); else if(pc == paper) System.out.println("電腦出了布"); else System.out.println("電腦出錯了"); // 玩家出拳 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); System.out.print("請出拳(0=剪刀, 1=石頭, 2=布):"); int player = Integer.parseInt(br.readLine()); if(player == scissors) System.out.println("你出了剪刀"); else if(player == stone) System.out.println("你了石頭"); else if(player == paper) System.out.println("你出了布"); else System.out.println("你出錯了"); if(player == pc) System.out.println("平手"); else if(player == scissors && pc == stone) System.out.println("你輸了"); else if(player == scissors && pc == paper) System.out.println("你贏了"); else if(player == stone && pc == scissors) System.out.println("你贏了"); else if(player == stone && pc == paper) System.out.println("你輸了"); else if(player == paper && pc == scissors) System.out.println("你輸了"); else if(player == paper && pc == stone) System.out.println("你贏了"); else System.out.println("遊戲錯誤"); } } ``` ### switch switch 可以用來比較數值、字元、字串、列舉(Enum)和Wrapper Class,不過別以為這樣它就比 if 來得沒用,使用適當的話,它可比 if 判斷式來得有效率;switch 的語法架構如下: ``` switch(變數名稱或運算式) { case 符合數字或字元: 陳述句一; break; case 符合數字或字元: 陳述句二; break; default: 陳述三; } ``` 首先看看 switch 的括號,當中置放您要取出數值的變數,取出數值之後,程式會開始與 case 中所設定的數字或字元作比對,如果符合就執行當中的陳述句,直到遇到 break 後離開 switch 區塊,如果沒有符合的數值或字元,則會執行 default 後的陳述句,default 不一定需要,如果沒有預設要處理的動作,您可以省去這個部份。 **範例:**成績等級比對如何使用 switch 來改寫: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("請輸入分數: "); int score = Integer.parseInt(br.readLine()); int level = (int) score/10; switch(level) { case 10: case 9: System.out.println("得A"); break; case 8: System.out.println("得B"); break; case 7: System.out.println("得C"); break; case 6: System.out.println("得D"); break; default: System.out.println("得E(不及格)"); } } } ``` 在這個程式中,您使用除法並取得運算後的商數,如果大於 90 的話,除以 10 的商數一定是 9 或 10(100 分時),在 case 10 中沒有任何的陳述,也沒有使用 break,所以會繼續往下執行,直到遇到 break 離開 switch 為止,所以學生成績 100 分的話,也會顯示 A 的成績等級;如果比對的條件不在10到6這些值的話,會執行 default 下的陳述,這表示商數小於 6,所以學生的成績等級就顯示為 E 了。 注意在 case 後的等號是冒號而不是分號,這是個很常打錯的符號;如果您比對的是字元,則記得加上單引號(' '),例如: ``` case 'A': ``` 這個程式與使用 if 來判斷成績等級的程式有何不同?如果純綷比對數字或字元的話,建議使用 switch,因為它只會在一開始的 switch 括號中取出變數值一次,然後將這個值與下面所設定的 case 比對,但如果您使用if的話,每次遇到條件式時,都要取出變數值,效率的差異就在這,例如: ``` if(a == 1) // .... else if(a == 2) // .... else if(a == 3) // .... ``` 這個程式片段在最差的狀況下,也就是 a = 3 時,共需三次比對,而每次比對都必須取出變數 a 的值一次,如果換成 switch 的話: ``` switch(a) { case 1: // .. break; case 2: // .. break; case 3: // .. break; } ``` 在這個程式片段中,您只在一開頭 switch 的括號中取出變數 a 的值,然後逐一比對下面的 case,效率的差別就在於這邊;當然並不是使用 if 就不好,遇到複合條件時,switch 就幫不上忙了,您無法在 switch 中組合複雜的條件陳述,這時就得使用 if 了,簡單的說,if 與 switch 兩者可以搭配著靈活使用。 ``` public class App { public static void main(String[] argc) throws Exception { // 今日運勢(5種結果) int luck = (int)(Math.random() * 5); // 產生0~4隨機整數 if(luck == 0) { System.out.println("今日會發財"); } else if(luck == 1) { System.out.println("今日會升官"); } else if(luck == 2) { System.out.println("今天有桃花"); } else if(luck == 3) { System.out.println("今日很平安"); } else if(luck == 4) { System.out.println("今日有飯吃"); } else { System.out.println("系統錯誤"); } switch(luck) { case 0: System.out.println("今日會發財"); break; case 1: System.out.println("今日會升官"); break; case 2: System.out.println("今天有桃花"); break; case 3: System.out.println("今日很平安"); break; case 4: System.out.println("今日有飯吃"); break; default: System.out.println("系統錯誤"); break; } } } ``` ``` import java.io.*; public class App { public static void main(String[] argc) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "utf-8")); System.out.print("請輸入一個字來測字:"); String word = br.readLine(); switch(word) { case "work": System.out.println("今日工作會遭遇小人"); break; case "love": System.out.println("今日愛情犯爛桃花"); break; case "money": System.out.println("今日破財消災"); break; default: System.out.println("測不出來"); break; } } } ``` > **補充:** > > - switch從JDK 7開始支援字串、列舉(Enum)和Wrapper Class,因此,如果使用的JDK版本是小於7的話,無法拿來比較字串、列舉和Wrapper Class。 > > - Java共有把個基本型別的Wrapper Class: > > | **原始型別** | 大小 | 最小值 | 最大值 | **外包型別** | > | ------------ | ------ | -------------------------------------- | ------------------------------------ | ------------ | > | **char** | 16-bit | Unicode 0 | Unicode 216-1 | Character | > | **byte** | 8-bit | -128 | +127 | Byte | > | **short** | 16-bit | -215 *(-32,768)* | +215-1 *(32,767)* | Short | > | **int** | 32-bit | -231 *(-2,147,483,648)* | +231-1 *(2,147,483,647)* | Integer | > | **long** | 64-bit | -263 *(-9,223,372,036,854,775,808)* | +263-1 *(9,223,372,036,854,775,807)* | Long | > | **float** | 32-bit | 32-bit IEEE 754 floating-point numbers | | Float | > | **double** | 64-bit | 64-bit IEEE 754 floating-point numbers | | Double | > | **boolean** | 1-bit | `true` 或 `false` | | Boolean | ## 迴圈 ### for 在 Java 中如果要進行重複性的指令執行,可以使用 for 迴圈式,它的基本語法如下: ``` for(初始式; 判斷式; 遞增式) { 陳述句一; 陳述句二; } ``` 如果陳述句只有一個,也就是非複合陳述句,{ } 可以省略不寫;for 迴圈的「第一個初始陳述句只會執行一次」,之後每次重新進行迴圈時,都會「根據判斷式來判斷是否執行下一個迴圈」,而每次執行完迴圈之後,都會「執行遞增式」。 **範例:** ``` public class App { public static void main(String[] args) { for(int i = 0; i < 10; i++) System.out.print(" " + i); } } ``` 執行結果: ``` 0 1 2 3 4 5 6 7 8 9 ``` 這是一個簡單的例子,但說明 for 的作用再適合不過,在 Java 中您可以直接在 for 中宣告變數與指定初始值,這個宣告的變數在 for 迴圈結束之後也會自動消失;初始變數的陳述句只被執行一次,接下來迴圈會根據 i 是否小於 10 來判斷是否執行迴圈,而每執行一次迴圈就將 i 加 1。 for 迴圈中也可以再使用 for 迴圈,初學者很喜歡用的例子就是顯示九九乘法表,這邊就用這個例子來說明: ``` public class App { public static void main(String[] args) { for(int j = 1; j < 10; j++) { for(int i = 2; i < 10; i++) { System.out.printf("%d*%d=%2d ",i, j, i * j); } System.out.println(); } } } ``` 執行結果: ``` 2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9 2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18 2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27 2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 ``` 事實上,for 迴圈的語法其實只是將三個複合陳述區塊寫在一個括號中而已,所不同的是第一個陳述區塊只會執行一次,第二個陳述區塊專司判斷是否繼續下一個迴圈,而第三個陳述區塊只是一般的陳述句,而不一定只放遞增運算式。 for 括號中的每個陳述區塊是以分號 ';' 作區隔,而在一個陳述區塊中若想寫兩個以上的陳述句,可以使用逗號 ',' 作區隔,例如: ``` public class App { public static void main(String[] args) { for (int i = 0, j = 0 ; i < 10 ; i++, j--) { System.out.printf("i=%d, j=%d\n", i, j); } } } ``` 輸出: ``` i=0, j=0 i=1, j=-1 i=2, j=-2 i=3, j=-3 i=4, j=-4 i=5, j=-5 i=6, j=-6 i=7, j=-7 i=8, j=-8 i=9, j=-9 ``` 一個for無窮迴圈 ``` for(;;) { System.out.println("Hi"); } ``` ##### 練習 1. 將下面猜數字遊戲改成可以猜三次的版本。 ``` import java.io.*; public class App { public static void main(String[] argc) throws Exception { // 答案,隨機產生1~10之間整數 int answer = (int)(Math.random() * 10) + 1; // 猜數字, 1~10之間, 如果猜3次沒猜出來, 遊戲結束, 玩家輸. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("猜數字遊戲,從1~10,三次沒猜中就輸了。"); System.out.print("請猜數字:"); int num = Integer.parseInt(br.readLine()); if(num == answer) System.out.println("恭喜,猜對了."); else System.out.println("猜錯."); } } ``` 答案: ``` import java.io.*; public class App { public static void main(String[] argc) throws Exception { // 答案,隨機產生1~10之間整數 int answer = (int) (Math.random() * 10) + 1; System.out.println("答案:" + answer); // 猜數字, 1~10之間, 如果猜3次沒猜出來, 遊戲結束, 玩家輸. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("猜數字遊戲,從1~10,三次沒猜中就輸了。"); for (int i = 1; i <= 3; i++) { System.out.print("請猜數字(第" + i + "次, 剩" + (3 - i + 1) + "次):"); int num = Integer.parseInt(br.readLine()); if (num == answer) { System.out.println("恭喜,猜對了."); break; // 猜對離開 } else System.out.println("猜錯."); } System.out.println("遊戲結束."); } } ``` 2. 試著用雙層迴圈畫出下面圖案: ``` * ** *** **** ***** ``` 3. 計算階層 ``` import java.io.*; public class App { public static void main(String[] argc) throws Exception { // 寫一程式,計算使用者輸入的階層 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("計算階層,請輸一個整數:"); int level = Integer.parseInt(br.readLine()); // 使用者輸入階層 int sum = 0; for(int i = 1 ; i <= level ; i++) { // System.out.print(i + " "); sum += i; } System.out.println(level + "的階層為:" + sum); } } ``` ### foreach 如果要走訪(也就是一筆一筆資料取出來處理)陣列或容器型態的資料,使用foreach迴圈會來的更方便。 例如: ```java public class App { public static void main(String[] args) throws Exception { String[] data = {"a", "b", "c"}; for(String elem : data) { System.out.println(elem); } } } ``` ###### 輸出: ``` a b c ``` ###### 說明: foreach迴圈的執行次數與該陣列或容器內元素的個數一樣,每次都會取出陣列或容器內一個元素存放到for迴圈內的變數內(此範例為elem變數),因此,for迴圈本體內的程式碼每次看到的變數值都會不一樣。 ### while Java 提供 while 迴圈式,它根據您所指定的條件式來判斷是否執行迴圈本體,語法如下所示: ``` while(條件式) { 陳述句一; 陳述句二; } ``` 如果迴圈本體只有一個陳述句,則 while 的 { } 可以省略不寫;while 像是沒有起始陳述與終止陳述的 for 迴圈,主要用於重複性的動作,而停止條件未知何時發生的情況,例如一個使用者輸入介面,使用者可能輸入 10 次,也可能輸入 20 次,這時迴圈停止的時機是未知的,您可以使用 while 迴圈來作這個事。 一個計算輸入成績平均的程式如範例: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int score = 0; int sum = 0; int count = -1; while(score != -1) { count++; sum += score; System.out.print("輸入分數(-1結束):"); score = Integer.parseInt(br.readLine()); } System.out.println("平均:" + (double) sum/count); } } ``` 在這個程式中,使用者的輸入次數是未知的,所以您使用 while 迴圈來判斷使用者的輸入是否為 -1,以作為迴圈執行的條件,一個執行的例子如下: ``` 輸入分數(-1結束):99 輸入分數(-1結束):88 輸入分數(-1結束):77 輸入分數(-1結束):-1 平均:88.0 ``` while 可以用作無窮迴圈,很多地方都用到的到無窮迴圈,例如遊戲設計中對使用者輸入裝置的輪詢(poll),或是動畫程式的播放都會使用到無窮廻圈,一個無窮迴圈如下所示: ``` while(true) { 迴圈內容; .... } ``` 無窮迴圈可以由自己迴圈中的某個條件式來結束,例如下面是一個迴圈內部終止的例子: ``` while(true) { 陳述句; if(條件式) break; // 跳離迴圈 .... } ``` 當「條件式」成立時,會執行 break 離開 while 迴圈,這個 break 與 switch 中的作用是一樣的,都是要離開當時執行的程式區塊時使用。 ### do...while do...while與while迴圈差別是while迴圈會進行條件式判斷再決定是否執行迴圈本體,如果判斷不通過,則迴圈一次都不會執行,但do...while迴圈會先執行一次迴圈本體後才進行第一次的條件式判斷。 語法如下: ``` do { 陳述句一; 陳述句二; ... 陳述句n; }while(條件式); ``` > **注意** > > do...while迴圈的while判斷是後面需要加上分號「;」作為結束,這個很常被疏忽。 由於do...while會先執行迴圈,常用於進行一些初始化或介面溝通的動作,例如: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int input = 0; int replay = 0; do { System.out.print("輸入整數值:"); input = Integer.parseInt(br.readLine()); System.out.println("輸入數為:" + ((input % 2 == 1) ? "奇數": "偶數")); System.out.print("要繼續嗎?(-1:結束 1:繼續)"); replay = Integer.parseInt(br.readLine()); } while(replay != -1); } } ``` 執行結果: ``` 輸入整數值:77 輸入數為: 奇數 要繼續嗎?( -1:結束 1:繼續)? -1 ``` ### break、continue break可以用來離開目前 switch、for、while、do...while 的區塊,並跳到區塊後的下一個陳述句,在switch中主要用來結束目前的case陳述句,避免下一個case的比對;而在 for、while與do...while迴圈中,主要用於中斷目前的迴圈執行。 continue的作用與break類似,只能用在迴圈,差別break會直接結束區塊並跳離執行,而continue只會中斷本次的執行,也就是忽略continue下面的陳述句,並跳回迴圈區塊的開頭繼續下一次的迴圈,而不會離開迴圈,例如: ``` for(int i = 1; i < 10; i++) { if(i == 5) break; System.out.println("i); } ``` 這段程式會顯示 1到 4,因為當 i 等於 5 時就會執行 break 而離開迴圈,再下面這個範例: ``` for(int i = 1; i < 10; i++) { if(i == 5) continue; System.out.println("i = " + i); } ``` 這段程式會顯示 1 到 4,與 6 到 9,當 i 等於 5 時,會執行 continue 直接結束此次迴圈,由於這次迴圈中 System.out.println() 該行並沒有被執行,所以 5 並不會顯示。 ### label break 與 continue 還可以配合label使用,語法為: ``` label名稱 { 陳述句1; 陳述句2; ... break或continue; ... 陳述句n; } ``` - break + label = 跳離該label的範圍。 - break + continue = 跳到label處的迴圈進行下一輪,label名稱必須在該迴圈上面。 break原本只會離開 for 迴圈,但加上label則可以離開整個區塊,例如: ``` public class App { public static void main(String[] args) { exit : { for(int i = 0; i < 10; i++) { if(i == 5) { System.out.println("離開了"); break exit; } } System.out.println("這串字不會出現"); } } } ``` 輸出為: ``` 離開了 ``` 當 `break exit;` 時,返回至 exit 標籤處,之後整個 exit 區塊不執行而跳過,所以`System.out.println("這串字不會出現");` 不會被執行。 再看continue範例: ``` public class App { public static void main(String[] args) { exit1: for(int i = 0; i < 10; i++){ exit2: for(int j = 0; j < 10; j++) { if(j == 9) { continue exit1; } } System.out.println("test"); } } } ``` 什麼都不會輸出,因為`continue exit1;`總是會回到第一層迴圈開頭重新跑迴圈,所以`System.out.println("test");`永遠沒有機會被執行到。 > **補充** > > 1. continue 配合label,可以自由的跳至任何一層 for 迴圈。 > 2. 跟判斷是一樣,label後面如果沒有大括號,則代表只有下一行為其內容。 ## 方法 方法(method)為多個陳述句的集合,通常會將程式內重複的程式碼包裝成方法,好處如下: 1. 減少程式碼撰寫的次數。 2. 減少錯誤並且容易除錯:當錯誤時只需要修改同一個地方即可。 3. 重複使用,並利於發展大型程式。 #### 語法 ##### 定義方法 ``` 修飾詞 回傳值 方法名稱(參數列表) { 方法本體 } ``` > **注意** > > 參數列表後面沒有分號。 ##### 呼叫方法 ``` 方法名稱(參數列表); ``` > **提示** > > 以分號做為結束。 #### 命名規則 1. 可使用英文字、數字和底線「_」,大小寫為不同名稱。 2. 第一個字不可以是數字。 3. 不可以使用Java保留字。 #### 命名慣例 1. 使用能代表該方法的有意義名稱。 2. 第一個英文字母小寫,隨後每個單字的第一個字母都大寫,其餘小寫。 一個簡單方法: ``` public class App { public static void main(String[] args) { show(); // 呼叫方法 } // 定義一個show方法 static void show() { System.out.println("Hello"); System.out.println("Java"); } } ``` 解說: 在App類別內定義了一個show方法,並且在在main方法裡透過呼叫show方法來執行show方法內的陳述句。 有參數的方法: ``` public class App { public static void main(String[] args) { showMe("Aaron"); // 呼叫方法 } // 定義一個show方法 static void showMe(String name) { System.out.printf("Hello %s\n", name); } } ``` 有回傳值的方法: ``` public class App { public static void main(String[] args) { int total = add(1, 3); // 呼叫方法 System.out.println(total); } // 定義一個add方法 static int add(int a, int b) { int c = a + b; return c; } } ``` > 補充: > > 1. 定義方法可以沒有參數,但是如果方法定義時有參數,鑿呼叫十一定要傳入參數。 >2. 如果有多個參數,可以透過逗點「,」來隔開。 > 3. static修飾詞為靜態方法,因為main方法本身為靜態方法,因此僅能呼叫靜態修飾過的方法。 > 4. 每個方法內自行宣告的變數都是區域性的,不會影響到其他方法同名的變數。 ### 遞迴 遞迴(Recursion),是指在方法中呼叫自身方法,方法必須有終止條件,才能完成執行,否則會陷入無窮循環,直到耗盡系統記憶體而程式終止。 使用遞迴來計算階層: ``` public class App { public static void main(String[] args) { int sum = factorial(5, 5); System.out.println(sum); } // 定義一個add方法 static int factorial(int a, int sum) { if(a > 0) return factorial(a - 1, sum + --a); return sum; } } ``` 使用遞迴的猜數字遊戲,猜1~10之間數字,直到猜中才結束,並顯示次數: ``` import java.io.*; public class App { public static void main(String[] args) throws Exception { int answer = (int)(Math.random() * 10) + 1; int times = guessGame(answer, 0); System.out.println("總共猜了:" + times + "次"); } // 定義一個add方法 static int guessGame(int answer, int times) throws Exception { System.out.print("請猜一數字(1~10之間):"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int player = Integer.parseInt(br.readLine()); if(answer != player) return guessGame(answer, ++times); return times + 1; } } ```