前兩篇已經了解了Java語言基礎,本篇開始Java的流程控制。流程控制對任何一門編程語言都是至關重要的,它提供了控制程序步驟的基本手段。
一、復合語句
Java語言的復合語句是以整個塊區為單位的語句,又稱塊語句。復合語句由“{”開始,“}”結束。
對於復合語句,我們只需要知道,復合語句為局部變量創建了一個作用域,該作用域為程序的一部分,在該作用域中某個變量被創建並能夠被使用,如果在某個變量的作用域外使用該變量,則會發生錯誤。並且復合語句中可以嵌套復合語句。
二、條件語句
條件語句可根據不同的條件執行不同的語句。包括if條件語句與switch多分支語句。這是學習Java的一個基礎與重點。
1. if條件語句
使用if條件語句,可選擇是否要執行緊跟在條件之后的那個語句。關鍵字if之后是作為條件的“布爾表達式”,如果該表達式返回true,則執行其后的語句;若為false,則不執行if后的語句。可分為簡單的if條件語句、if···else語句和if···else if多分支語句。
int a = 100; if(a == 100) { System.out.println(a); }
如上方代碼,{}之間為復合語句,if為條件語句,翻譯過來就是如果a等於100,則輸出a的值,否則不執行。
如果if后只有一條語句,比如上述代碼只有一條輸出,可以不加{},但為了代碼的可讀性,以及防止代碼過多出現不必要的錯誤,建議所有的if、else后都加上相應的{}。
2. if···else語句
if···else語句是條件語句中最常用的一種形式,它會針對某種條件有選擇的作出處理。通常表現為“如果滿足某種條件,就進行某種處理,否則就進行另一種處理”。
if后的()內的表達式必須是boolean型的。如果為true,則執行if后的復合語句;如果為false,則執行else后的復合語句。
如:
1 public class Getifelse { 2 3 public static void main(String[] args) { 4 int math = 80; // 聲明,數學成績為80(及格) 5 int english = 50; // 聲明,英語成績為50(不及格) 6 7 if(math >= 60) { // if判斷語句判斷math是否大於等於60 8 System.out.println("math has passed"); 9 } else { // if條件不成立 10 System.out.println("math has not passed"); 11 } 12 13 if(english >= 60) { // if判斷語句判斷english是否大於等於60 14 System.out.println("english has passed"); 15 } else { // if條件不成立 16 System.out.println("english has not passed"); 17 } 18 } 19 20 }
運行結果為:
3. if···else if多分支語句
if···else if多分支語句用於針對某一事件的多種情況進行處理。通常表現為“如果滿足某種條件”,就進行某種處理,否則,如果滿足另一種條件,則進行另一種處理。
如:
1 public class GetTerm { 2 3 public static void main(String[] args) { 4 int x = 40; 5 6 if(x > 60) { 7 System.out.println("x的值大於60"); 8 } else if (x > 30) { 9 System.out.println("x的值大於30但小於60"); 10 } else if (x > 0) { 11 System.out.println("x的值大於0但小於30"); 12 } else { 13 System.out.println("x的值小於等於0"); 14 } 15 } 16 17 }
在本例中,由於x為40,條件x>60為false,程序向下執行判斷;條件x>30為真,所以執行條件x>30后的程序塊中的語句。輸出結果如下:
所以,if語句只執行條件為真的語句,其它語句都不會執行。
4. switch多分支語句
switch語句是一種比較簡單明了的多選一的選擇,在Java語言中,可以用switch語句將動作組織起來進行多選一。語法格式如下:
switch(表達式) { case 常量值1: 語句塊1 [break;] ... case 常量值n: 語句塊2 [break;] default: 語句塊 n+1; [break;] }
switch語句中表達式的值必須是整型或字符型,常量值1~n必須也是整型或字符型。
簡單說一下switch語句是怎么執行的(重點,初學的朋友要注意)。首先switch語句先計算表達式的值,如果表達式的值與case后的常量值相同,則執行該case后的若干個語句,直到遇到break語句為止。如果沒有break,則繼續執行下一case中的若干語句,直到遇到break為止。若沒有一個常量的值與表達式的值相同,則執行default后面的語句。default語句可選,如果不存在default語句,而且switch語句中的表達式的值與任何case的常量值都不相同,則switch不做任何處理。並且,同一個switch語句,case的常量值必須互不相同。
例:用switch語句打印出星期的英文單詞
1 import java.util.Scanner; 2 3 public class GetSwitch { 4 5 public static void main(String[] args) { 6 Scanner scan = new Scanner(System.in); 7 System.out.print("請輸入今天星期幾:"); 8 int week = scan.nextInt(); 9 10 switch (week) { 11 case 1: 12 System.out.println("Monday"); 13 break; 14 case 2: 15 System.out.println("Tuesday"); 16 break; 17 case 3: 18 System.out.println("Wednesday"); 19 break; 20 case 4: 21 System.out.println("Thursday"); 22 break; 23 case 5: 24 System.out.println("Friday"); 25 break; 26 case 6: 27 System.out.println("Saturday"); 28 break; 29 case 7: 30 System.out.println("Sunday"); 31 break; 32 default: 33 System.out.println("Sorry,I don't konw"); 34 break; 35 } 36 } 37 38 }
這里Scanner是一個掃描器,用來輸入的,使用時需在package下面用import語句導入Scanner類,我們可以在控制台中輸入一個數字,然后用nextInt()來接收,這樣week的值就是我們輸入的數字,接下來執行switch語句,有7個case分別對應周一到周末,default在輸入1~7以外的數據時執行。假設在控制台中輸入1,則控制台會執行case 1后的語句,輸出了Monday,結果如下:
要注意的是case后的常量表達式的值可以為整數和字符,但不可以是實數后字符串,比如case 1.1,case “ok”都是非法的。
三、循環語句
循環語句就是在滿足一定條件的情況下反復執行某一個操作。包括while循環語句、do···while循環語句和for循環語句。
1. while循環語句
while循環語句的循環方式為利用一個條件來控制是否要繼續反復執行這個語句。
假設現在有1~10十個數字,我們要將它們相加求和,在學習while之前可能會直接用+運算符從1加到10,也就是1+2+3+4+5+6+7+8+9+10,但如果現在需要從1加到1萬呢?10萬?所以,我們要引入while循環來進行循環相加,如下:
1 public class GetSum { 2 3 public static void main(String[] args) { 4 int x = 1; // 定義初值 5 int sum = 0; // 定義求和變量,用於存儲相加后的結果 6 7 while(x <= 10) { 8 sum += x; // 循環相加,也即 sum = sum + x; 9 x++; 10 } 11 System.out.println(sum); 12 } 13 14 }
這就是一個從1加到10的代碼,首先定義一個初值x為1,然后定義一個存儲相加結果的變量sum為0,循環條件為x<=10,也就是每次判斷x<=10是否成立,成立則繼續循環。循環內第一句“sum +=x;”其實就是“sum = sum +x;”的另一種寫法,是在sum的基礎上加x,並賦給sum,那么此時sum的值為0+1=1了,然后x++,x自增1為2,判斷x<=10,則繼續循環,sum的值變為1+2=3,然后x++變為3,如此循環下去,直到x為11時退出循環,此時sum的值就是1+2+3+4+5+6+7+8+9+10最后的結果55了。
在while循環語句中,如果while語句后直接加分號,如while(a == 5);代表當前while為空語句,進入無線循環。
2. do···while循環語句
do···while循環語句與while循環語句的區別是,while循環語句先判斷條件是否成立再執行循環體,而do···while循環語句則先執行一次循環后,再判斷條件是否成立。也即do···while至少執行一次。語法格式如下:
do { 執行語句 } while (條件表達式);
下面對while循環語句與do···while循環語句進行一個對比:
1 public class Cycle { 2 3 public static void main(String[] args) { 4 int a = 10; 5 int b = 10; 6 7 // while循環語句 8 while(a == 8) { 9 System.out.println("a == " + a); 10 a--; 11 } 12 13 // do···while循環語句 14 do { 15 System.out.println("b == " + b); 16 b--; 17 } while(b == 8); 18 } 19 20 }
運行結果為:
這里,a、b都為10,先看while循環語句,進入while下語句塊的條件是a == 8,很明顯不成立,所以不執行,結果中沒有關於a的結果,然后再看do···while循環語句,先執行一次do后的語句塊,輸出“b == 10”,然后判斷while條件b == 8不成立,循環結束,所以結果只有一個do···while語句中執行的第一步b == 10。
3. for循環語句
for循環語句是Java程序設計中最有用的循環語句之一。一個for循環可以用來重復執行某條語句,知道某個條件得到滿足。語法格式如下:
for(表達式1; 表達式2; 表達式3) { 語句序列 }
其中,表達式1為初始化表達式,負責完成變量的初始化;表達式2為循環條件表達式,指定循環條件;表達式3為循環后操作表達式,負責修整變量,改變循環條件。三個表達式間用分號隔開
例:用for循環語句求100以內所有偶數的和。
1 public class Circulate { 2 3 public static void main(String[] args) { 4 int sum = 0; 5 6 for(int i=2; i<=100; i+=2) { 7 sum += i; 8 } 9 10 System.out.println(sum); 11 } 12 13 }
for循環內,首先定義一個變量並賦初值,表示循環中i從2開始進行,然后條件為i<=100,即i<=100時進行循環並執行語句塊中的語句,第三個表達式“i+=2”表示每次循環執行i=i+1,即沒循環一次,i的值為在原來的基礎上加2后的值。然后循環求sum的值,即2+4+6+8+···+100,當i=102時退出循環,執行輸出語句,輸出結果為2550。
說到for循環語句就不得提到foreach語句了,它是Java5后新增的for語句的特殊簡化版本,並不能完全替代for語句,但所有foreach語句都可以改寫為for語句。foreach語句在遍歷數組等時為程序員提供了很大的方便。語法格式如下:
for(元素變量x : 遍歷對象obj) { 引用了x的Java語句; }
下面舉一個例子說明foreach怎么遍歷的:
int array[] = {7, 8, 9}; for (int arr : array) { System.out.println(arr); }
array是一個一維數組,其中有7、8、9三個值,現在要將這三個值打印到控制台上,用foreach語句相比for語句會簡單很多。其中,在for的條件中,先定義了一個整型變量arr(只要和要遍歷的數組名不同即可),冒號后則是要遍歷的數組名,那么{}間就是要循環的內容了。
四、跳轉語句
Java語言提供了三種跳轉語句,分別是break語句、continue語句和return語句。
1. break語句
break語句剛剛在switch中已經見過了,是用來中止case的。實際上break語句在for、while、do···while循環語句中,用於強行退出當前循環,為什么說是當前循環呢,因為break只能跳出離它最近的那個循環的循環體,假設有兩個循環嵌套使用,break用在內層循環下,則break只能跳出內層循環,如下:
for(int i=0; i<n; i++) { // 外層循環 for(int j=0; j<n ;j++) { // 內層循環 break; } }
2. continue語句
continue語句只能用於for、while、do···while循環語句中,用於讓程序直接跳過其后面的語句,進行下一次循環。
例:輸出10以內的所有奇數
1 public class ContinueDemo { 2 3 public static void main(String[] args) { 4 int i = 0; 5 6 while(i < 10) { 7 i++; 8 9 if(i%2 == 0) { // 能被2整除,是偶數 10 continue; // 跳過當前循環 11 } 12 13 System.out.print(i + " "); 14 } 15 } 16 17 }
這里if條件判斷是否為偶數,如果是偶數則執行continue,直接跳出本次循環,不進行continue后的步驟(即不執行輸出語句),然后下一次循環為奇數,輸出i,運行結果如下:
3. return語句
return語句可以從一個方法返回,並把控制權交給調用它的語句。
public void getName() { return name; }
例如上方代碼,這是一個方法用於獲取姓名,當調用這個方法時將返回姓名值。