控制執行流程
if-else
while、do-while和for
foreach語法
標簽
return
break 和continue
switch
if-else
所有條件語句都利用條件表達式的真或假來決定執行路徑,if-else是控制程基本的形式。其中的else是可選的,所以可按下述兩種形式來使用if:
if(Boolean-expression)
statement
或
if(Boolean-expression)
statement
else
statement
布爾表達式必須產生一個布爾結果,statement指用分號結尾的簡單語句,或復合語句——封閉在花括號內的一組簡單語句。
public class Test {
public static void main(String[] args) {
int i = 1;
if(i == 1) {
System.out.println("i等于1");
}else {
System.out.println("i不等于1");
}//輸出:i等于1
}
}
while、do-while和for
while、do- while和for用來控制循環,有時將它們劃分為迭代語句(iteration statement),句會重復執行,直到起控制作用的布爾表達式(Booleanexpression)得到“假”的結果為止。
while循環格式如下:
while(Boolean-expression)
statement
循環剛開始時,會計算一次布爾表達式的值;而在語句的下一次迭代開始前會再計算一次
public class Test {
public static void main(String[] args) {
int i = 0;
while(i < 10) {
System.out.print(i);
i++;
}
}//輸出:0123456789
}
這段代碼的意思是“循環輸出i的值”
do-while循環格式如下:
do
statement
while(Boolean-expression);
while和do-while唯一的區別就是do-while中的語句至少會執行一次,即便表達式第一次就被計算為false。而在 while循環結構中,如果條件第一次就為false,那么其中的語句根本不會執行。
public class Test {
public static void main(String[] args) {
int i = 0;
do {
System.out.print(i);
i++;
}while(i < 10);
}//輸出:0123456789
}
這段代碼的意思是“循環輸出i的值”
for循環
這可能是最經常使用的迭代形式,這種在第一次迭代之前要進行初始化。隨后,它會進行條件測試,而且在每一次迭代結束時,進行某種形式的“步進”。
循環格式如下:
for(initialization ; Boolean-expression ; step)
statement
初始化表達式(initialization)、布爾表達式(Boolean-expression )或者步進(step)運算,都可以為空。每次迭代前會測試布爾表達式。若獲得的結果是 false,就會跳過循環體并執行for語句后面的代碼。每次循環結束,會執行一次步進。
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 10;i++) {
System.out.println(i);
}
}//輸出:0123456789
}
這段代碼的意思是“循環輸出i的值”
foreach語法
Java SE5引入了一種新的更加簡潔的for語法用于數組和容器,即foreach語法,表示不必創建int變量去對由訪問項構成的序列進行計數,foreach將自動產生毎一項。
public class Test {
public static void main(String[] args) {
int[] ints = new int[]{0,1,2,3,4};
for(int i :ints) {
System.out.print(i);
}
}//輸出:01234
上面代碼語句定義了一個int類型的數組ints,并且在循環語句中定義了一個int類型的變量i,循環時將數組ints中的元素賦值給i。任何返回一個數組的方法或集合都可以使用 foreach語法。String類有一個方法toCharArray(),它返回一個char數組亦能應用foreach語法。
標簽
編程語言中一開始就有goto關鍵詞了。事實上,goto起源于匯編語言的程序控制:“若條件A成立,則跳到這里,否則跳到那里”。如果閱讀由編譯器最終生成的匯編代碼,就會發現程序控制執行流程控制里包含了許多跳轉。(Java編譯器生成它自己的“匯編代碼”,但是這個代碼是運行在Java虛擬機上的,而不是直接運行在CPU硬件上)
盡管goto仍是Java中的一個保留字,但在語言中并未使用它,Java沒有goto,然而,Java也能完成一些類似于跳轉的操作,這與break和continue這兩個關鍵詞有關。它們其實不是一個跳轉,而是中斷迭代語句的一種方法。之所以把它們納入goto問題中一起討論,是由于它們使用了相同的機制:標簽。
標簽是后面跟有冒號的標識符,就像下面這樣:
labell:
在Java中,標簽起作用的唯一的地方剛好是在迭代語句之前。“剛好之前”的意思表明,在標簽和迭代之間置入任何語句都不好。而在迭代之前設置標簽的唯一理由是:我們希望在其中嵌套另一個迭代或者一個開關。這是由于break和continue關鍵詞通常只中斷當前循環,但若隨同標簽一起使用,它們就會中斷循環,直到標簽所在的地方:
label1:
outer-iteration{
inner-iteration{
//…
break;//(1)
//…
continue;//(1)
//…
continue label1;//(1)
//…
break label1;//(1)
}
}
在(1)中,break中斷內部迭代,回到外部迭代。
在(2)中,continue使執行點移回內部迭代的起始處。
在(3)中,continue label1同時中斷內部迭代以及外部迭代,直接轉到label1處,隨后,它實際上是繼續迭代過程,但卻從外部迭代開始。
在(4)中,break label1也會中斷所有迭代,并回到label1處,但并不重新進人迭代。也就是說,它實際是完全中止了兩個迭代。
return
在Java中有多個關鍵詞表示無條件分支,它們只是表示這個分支無需任何測試即可發生。這些關鍵詞包括return、break、continue
return關鍵詞有兩方面的用途,一方面指定一個方法返回什么值(假設它沒有void返回值),另一方面它會導致當前的方法退出,并返回那個值。如果在返回void的方法中沒有return語句,那么在該方法的結尾處會有一個隱式的return,因此在方法中并非總是必須要有一個return語句。但是如果一個方法聲明它將返回void之外的其他東西,那么必須確保每一條代碼路徑都將返回一個值。
public class Test {
public static String testReturn(int i) {
if(i == 1) {
return "傳進來的值是1";
}else if(i == 2) {
return "傳進來的值是2";
}else {
return "傳進來的值未知";
}
}
public static void main(String[] args) {
int i = 1;
String str = Test.testReturn(i);
System.out.println(str);
}//輸出:傳進來的值是1
}
break 和continue
在任何迭代語句的主體部分,都可用break和continue控制循環的流程。其中,break用于強行退出循環,不執行循環中剩余的語句。而continue則停止執行當前的迭代,然后退回循環起始處,開始下一次迭代。
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 10 ; i++){
if(i%2 == 0){
continue;
}else if(i == 9){
System.out.print(i+",退出循環");
}else{
System.out.print(i+",");
}
}
}//輸出:1,3,5,7,9,退出循環
}
在上面的for循環中,i的值永遠不會達到10,因為一旦i達到9,break語句就用中斷循環。同時上面的循環中也不會輸出偶數,因為一旦i為偶數時,continue語句就會停止執行當前的循環,并進入下一次循環起始處。
switch
switch語句是實現多路選擇(也就是說從一系列執行路徑中挑選一個)的一種干凈利落的方法。它要求使用一個選擇因子(byte、short、char、int、enum(Java 5)、String(Java 7))。switch有時也被劃歸為一種選擇語句,根據表達式的值,switch語句可以從一系列代碼中選出一段去執行。它的格式如下:
switch(integral-selector){
case integral-value1 : statement;break;
case integral-value2 : statement;break;
case integral-value3 : statement;break;
case integral-value4 : statement;break;
//…
default : statement;
}
其中,Integral-selector(選擇因子)是一個能夠產生數值的表達式,switch能將這個表達式的結果與每個integral-value (數值)相比較。若發現相符的,就執行對應的語句(單一語句或多條語句,其中并不需要花括號)。若沒有發現相符的,就執行default(默認)語句。
在上面的定義中,大家會注意到每個case均以一個break結尾,這樣可使執行流程跳轉至switch主體的末尾。這是構建switch語句的一種傳統方式,但break是可選的。若省略break,會繼續執行后面的case語句,直到遇到一個break為止。盡管通常不想出現這種情況,但對有經驗的程序員來說,也許能夠善加利用這種情況。注意最后的default語句沒有break,因為執行流程已到了 break的跳轉目的地。當然,如果考慮到編程風格方面的原因,完全可以在default語句的末尾放置一個break,盡管它并沒有任何實際的用處。
public class Test {
public static void main(String[] args) {
String str = "123";
switch (str) {
case "1":
System.out.println("1");
break;
case "2":
System.out.println("2");
break;
case "3":
System.out.println("3");
break;
default:
System.out.println("default");
break;
}
}//輸出:default
}