1 選擇結(jié)構(gòu)if
1.1 if語(yǔ)句
??在Java中,if語(yǔ)句的具體語(yǔ)法格式如下:
if (條件語(yǔ)句){
執(zhí)行語(yǔ)句;
……
}
??上述格式中,判斷條件是一個(gè)布爾值,當(dāng)判斷條件為true時(shí),{}中的執(zhí)行語(yǔ)句才會(huì)執(zhí)行。if語(yǔ)句的執(zhí)行流程如下圖所示。

??接下來(lái)通過一段代碼,學(xué)習(xí)一下if語(yǔ)句的具體用法
public class HelloWorld{
public static void main(String[] args){
int x = 5;
if (x < 10){
x++;
}
System.out.println("x="+x);
}
}

??在上述代碼中,定義了一個(gè)變量x,其初始值為5。在if語(yǔ)句的判斷條件中判斷x的值是否小于10,很明顯條件成立,{}中的語(yǔ)句會(huì)被執(zhí)行,變量x的值將進(jìn)行自增。從運(yùn)行結(jié)果可以看出,x的值已由原來(lái)的5變成了6。
1.2 if…else語(yǔ)句
??if…else語(yǔ)句是指如果滿足某種條件,就進(jìn)行某種處理,否則就進(jìn)行另一種處理。例如,要判斷一個(gè)正整數(shù)的奇偶,如果該數(shù)字能被2整除則是一個(gè)偶數(shù),否則該數(shù)字就是一個(gè)奇數(shù)。if…else語(yǔ)句具體語(yǔ)法格式如下:
if (判斷條件){
執(zhí)行語(yǔ)句1
……
}else{
執(zhí)行語(yǔ)句2
……
}
??上述格式中,判斷條件是一個(gè)布爾值。當(dāng)判斷條件為true時(shí),if后面{}中的執(zhí)行語(yǔ)句1會(huì)執(zhí)行。當(dāng)判斷條件為false時(shí),else后面{}中的執(zhí)行語(yǔ)句2會(huì)執(zhí)行。if…else語(yǔ)句的執(zhí)行流程如下圖所示。

??接下來(lái)通過一段代碼,來(lái)實(shí)現(xiàn)判斷奇偶數(shù)的程序
public class HelloWorld{
public static void main(String[] args){
int num = 19;
if (num%2 == 0){
//判斷條件成立
System.out.println("num是一個(gè)偶數(shù)");
}else{
System.out.println("num是一個(gè)奇數(shù)");
}
}
}

??上述代碼中,變量num的值為19,模以2的結(jié)果為1,不等于0,判斷條件不成立。因此會(huì)執(zhí)行else后面{}中的語(yǔ)句,打印“num是一個(gè)奇數(shù)”。
1.3 if…else if…else語(yǔ)句
??if…else if…else語(yǔ)句用于對(duì)多個(gè)條件進(jìn)行判斷,進(jìn)行多種不同的處理。例如,對(duì)一個(gè)學(xué)生的考試成績(jī)進(jìn)行等級(jí)的劃分,如果分?jǐn)?shù)大于80分等級(jí)為優(yōu),否則,如果分?jǐn)?shù)大于70分等級(jí)為良,否則,如果分?jǐn)?shù)大于60分等級(jí)為中,否則,等級(jí)為差。if…else if…else語(yǔ)句具體語(yǔ)法格式如下:
if (判斷條件1) {
執(zhí)行語(yǔ)句1
} else if (判斷條件2) {
執(zhí)行語(yǔ)句2
}
...
else if (判斷條件n) {
執(zhí)行語(yǔ)句n
} else {
執(zhí)行語(yǔ)句n+1
}
??上述格式中,判斷條件是一個(gè)布爾值。當(dāng)判斷條件1為true時(shí),if后面{}中的執(zhí)行語(yǔ)句1會(huì)執(zhí)行。當(dāng)判斷條件1為false時(shí),會(huì)繼續(xù)執(zhí)行判斷條件2,如果為true則執(zhí)行語(yǔ)句2,以此類推,如果所有的判斷條件都為false,則意味著所有條件均未滿足,else后面{}中的執(zhí)行語(yǔ)句n+1會(huì)執(zhí)行。if…else if…else語(yǔ)句的執(zhí)行流程如下圖所示。

??接下來(lái)通過一段代碼,來(lái)實(shí)現(xiàn)對(duì)學(xué)生考試成績(jī)進(jìn)行等級(jí)劃分的程序
public class HelloWorld{
public static void main(String[] args){
int grade = 75; //定義學(xué)生成績(jī)
if (grade > 80) {
//滿足條件 grade > 80
System.out.println("該成績(jī)等級(jí)為優(yōu)");
}else if (grade > 70){
//滿足條件 grade > 70
System.out.println("該成績(jī)等級(jí)為良");
}else if (grade > 60){
//滿足條件 grade > 60
System.out.println("該成績(jī)等級(jí)為中");
}
else{
//以上都不滿足
System.out.println("該成績(jī)等級(jí)為差");
}
}
}

??上述代碼中,定義了學(xué)生成績(jī)grade為75。它不滿足第一個(gè)判斷條件grade>80,會(huì)執(zhí)行第二個(gè)判斷條件grade>70,條件成立,因此會(huì)打印“該成績(jī)的等級(jí)為良”。
1.4 選擇結(jié)構(gòu)if語(yǔ)句與三元運(yùn)算轉(zhuǎn)換
??三元運(yùn)算符,它和if-else語(yǔ)句類似,語(yǔ)法如下:
判斷條件 ? 表達(dá)式1 : 表達(dá)式2
??三元運(yùn)算符會(huì)得到一個(gè)結(jié)果,通常用于對(duì)某個(gè)變量進(jìn)行賦值,當(dāng)判斷條件成立時(shí),運(yùn)算結(jié)果為表達(dá)式1的值,否則結(jié)果為表達(dá)式2的值。例如求兩個(gè)數(shù)x、y中的較大者,如果用if…else語(yǔ)句來(lái)實(shí)現(xiàn),具體代碼如下:
public class HelloWorld{
public static void main(String[] args){
int x = 0;
int y = 1;
int max;
if (x>y){
max = x;
}else{
max =y;
}
System.out.println(max);
}
}
??上面的代碼運(yùn)行之后,變量max的值為1。上述代碼可以使用三元運(yùn)算符代替
int max = x > y ? x : y;
2 循環(huán)結(jié)構(gòu)
2.1 循環(huán)語(yǔ)句while
??while循環(huán)語(yǔ)句和選擇結(jié)構(gòu)if語(yǔ)句有些相似,都是根據(jù)條件判斷來(lái)決定是否執(zhí)行大括號(hào)內(nèi)的執(zhí)行語(yǔ)句。區(qū)別在于,while語(yǔ)句會(huì)反復(fù)地進(jìn)行條件判斷,只要條件成立,{}內(nèi)的執(zhí)行語(yǔ)句就會(huì)執(zhí)行,直到條件不成立,while循環(huán)結(jié)束。while循環(huán)語(yǔ)句的語(yǔ)法結(jié)構(gòu)如下:
while(循環(huán)條件){
執(zhí)行語(yǔ)句
………
}
??在上面的語(yǔ)法結(jié)構(gòu)中,{}中的執(zhí)行語(yǔ)句被稱作循環(huán)體,循環(huán)體是否執(zhí)行取決于循環(huán)條件。當(dāng)循環(huán)條件為true時(shí),循環(huán)體就會(huì)執(zhí)行。循環(huán)體執(zhí)行完畢時(shí)會(huì)繼續(xù)判斷循環(huán)條件,如條件仍為true則會(huì)繼續(xù)執(zhí)行,直到循環(huán)條件為false時(shí),整個(gè)循環(huán)過程才會(huì)結(jié)束。
??while循環(huán)的執(zhí)行流程如下圖所示。

??接下來(lái)通過一段代碼,來(lái)實(shí)現(xiàn)打印1~4之間的自然數(shù)
public class HelloWorld{
public static void main(String[] args){
int x = 1; //定義變量x,初始值為1
while (x <= 4){ //循環(huán)條件
System.out.println("x="+x); //條件成立,打印x的值
x++; //x進(jìn)行自增
}
}
}

??在上述代碼中,x初始值為1,在滿足循環(huán)條件x <= 4的情況下,循環(huán)體會(huì)重復(fù)執(zhí)行,打印x的值并讓x進(jìn)行自增。因此打印結(jié)果中x的值分別為1、2、3、4。
??大家要注意的是,代碼x++用于在每次循環(huán)時(shí)改變變量x的值,從而達(dá)到最終改變循環(huán)條件的目的。如果沒有這行代碼,整個(gè)循環(huán)會(huì)進(jìn)入無(wú)限循環(huán)的狀態(tài),永遠(yuǎn)不會(huì)結(jié)束。
2.2 循環(huán)語(yǔ)句for
??for循環(huán)語(yǔ)句是最常用的循環(huán)語(yǔ)句,一般用在循環(huán)次數(shù)已知的情況下。for循環(huán)語(yǔ)句的語(yǔ)法格式如下:
for(初始化表達(dá)式; 循環(huán)條件; 操作表達(dá)式){
執(zhí)行語(yǔ)句
………
}
??在上面的語(yǔ)法結(jié)構(gòu)中,for關(guān)鍵字后面()中包括了三部分內(nèi)容:初始化表達(dá)式、循環(huán)條件和操作表達(dá)式,它們之間用“;”分隔,{}中的執(zhí)行語(yǔ)句為循環(huán)體。
??接下來(lái)分別用1表示初始化表達(dá)式、2表示循環(huán)條件、3表示操作表達(dá)式、4表示循環(huán)體,通過序號(hào)來(lái)具體分析for循環(huán)的執(zhí)行流程。具體如下:
for(1 ; 2 ; 3){
4
}
第一步,執(zhí)行1
第二步,執(zhí)行2,如果判斷結(jié)果為true,執(zhí)行第三步,如果判斷結(jié)果為false,執(zhí)行第五步
第三步,執(zhí)行4
第四步,執(zhí)行3,然后重復(fù)執(zhí)行第二步
第五步,退出循環(huán)
??接下來(lái)通過一個(gè)案例對(duì)自然數(shù)1~4進(jìn)行求和
public class HelloWorld{
public static void main(String[] args){
int sum = 0; //定義變量sum,用于記錄累加的和
for (int i = 1;i <= 4;i++){ //i的值會(huì)在1~4之間變化
sum += i; //實(shí)現(xiàn)i值的累加
}
System.out.println(sum);
}
}

??上述代碼中,變量i的初始值為1,在判斷條件i<=4為true的情況下,會(huì)執(zhí)行循環(huán)體sum+=i,執(zhí)行完畢后,會(huì)執(zhí)行操作表達(dá)式i++,i的值變?yōu)?,然后繼續(xù)進(jìn)行條件判斷,開始下一次循環(huán),直到i=5時(shí),條件i<=4為false,結(jié)束循環(huán),執(zhí)行for循環(huán)后面的代碼,打印“sum=10”。
2.3 循環(huán)語(yǔ)句do…while
do…while循環(huán)語(yǔ)句和while循環(huán)語(yǔ)句功能類似,其語(yǔ)法結(jié)構(gòu)如下:
do {
執(zhí)行語(yǔ)句
………
} while(循環(huán)條件);
??在上面的語(yǔ)法結(jié)構(gòu)中,關(guān)鍵字do后面{}中的執(zhí)行語(yǔ)句是循環(huán)體。do…while循環(huán)語(yǔ)句將循環(huán)條件放在了循環(huán)體的后面。這也就意味著,循環(huán)體會(huì)無(wú)條件執(zhí)行一次,然后再根據(jù)循環(huán)條件來(lái)決定是否繼續(xù)執(zhí)行。
do…while循環(huán)的執(zhí)行流程如下圖所示。

??接下來(lái)使用do…while循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)打印1~4之間的自然數(shù)
public class HelloWorld{
public static void main(String[] args){
int x = 1; //定義變量x,初始值為1
do{
System.out.println("x="+x); //打印x的值
x++; //x的值自增
} while(x <= 4); //循環(huán)條件
}
}

2.4 循環(huán)嵌套
??嵌套循環(huán)是指在一個(gè)循環(huán)語(yǔ)句的循環(huán)體中再定義一個(gè)循環(huán)語(yǔ)句的語(yǔ)法結(jié)構(gòu)。while、do…while、for循環(huán)語(yǔ)句都可以進(jìn)行嵌套,并且它們之間也可以互相嵌套,如最常見的在for循環(huán)中嵌套for循環(huán),格式如下:
for(初始化表達(dá)式; 循環(huán)條件; 操作表達(dá)式) {
………
for(初始化表達(dá)式; 循環(huán)條件; 操作表達(dá)式) {
執(zhí)行語(yǔ)句
………
}
………
}
接下來(lái)通過一個(gè)練習(xí),來(lái)實(shí)現(xiàn)使用“*”打印直角三角形
public class HelloWorld{
public static void main(String[] args){
int i,j; //定義兩個(gè)循環(huán)變量
for (i=1;i <= 9;i++){ //外層循環(huán)
for (j=1;j <= i;j++){ //內(nèi)層循環(huán)
System.out.print("*"); //打印*
}
System.out.print("\n"); //換行
}
}
}
運(yùn)行結(jié)果如下所示

??在上述代碼中定義了兩層for循環(huán),分別為外層循環(huán)和內(nèi)層循環(huán),外層循環(huán)用于控制打印的行數(shù),內(nèi)層循環(huán)用于打印“”,每一行的“”個(gè)數(shù)逐行增加,最后輸出一個(gè)直角三角形。
2.5 跳轉(zhuǎn)語(yǔ)句(break、continue)
??跳轉(zhuǎn)語(yǔ)句用于實(shí)現(xiàn)循環(huán)執(zhí)行過程中程序流程的跳轉(zhuǎn),在Java中的跳轉(zhuǎn)語(yǔ)句有break語(yǔ)句和continue語(yǔ)句。
1、break語(yǔ)句
??在switch條件語(yǔ)句和循環(huán)語(yǔ)句中都可以使用break語(yǔ)句。當(dāng)它出現(xiàn)在switch條件語(yǔ)句中時(shí),作用是終止某個(gè)case并跳出switch結(jié)構(gòu)。當(dāng)它出現(xiàn)在循環(huán)語(yǔ)句中,作用是跳出循環(huán)語(yǔ)句,執(zhí)行后面的代碼。
public class HelloWorld{
public static void main(String[] args){
int x = 1; //定義變量x,初始值為1
while (x <= 4){ //循環(huán)條件
System.out.println("x="+x); //條件成立,打印x的值
if (x == 3){
break;
}
x++; //x進(jìn)行自增
}
}
}
運(yùn)行結(jié)果

在上述帶代碼中,通過while循環(huán)打印x的值,當(dāng)x的值為3時(shí)使用break語(yǔ)句跳出循環(huán)。因此打印結(jié)果中并沒有出現(xiàn)“x=4”。
2、標(biāo)記
??當(dāng)break語(yǔ)句出現(xiàn)在嵌套循環(huán)中的內(nèi)層循環(huán)時(shí),它只能跳出內(nèi)層循環(huán),如果想使用break語(yǔ)句跳出外層循環(huán)則需要對(duì)外層循環(huán)添加標(biāo)記。如下所示,只能打印4行“*”。
public class HelloWorld{
public static void main(String[] args){
int i,j; //定義兩個(gè)循環(huán)變量
itcase: for (i=1;i <= 9;i++){
for (j=1;j <=i;j++){
if (i > 4){
break itcase;
}
System.out.print("*");
}
System.out.print("\n");
}
}
}

3、continue語(yǔ)句
??continue語(yǔ)句用在循環(huán)語(yǔ)句中,它的作用是終止本次循環(huán),執(zhí)行下一次循環(huán)。接下來(lái)通過一個(gè)練習(xí)對(duì)1~100之內(nèi)的奇數(shù)求和
public class HelloWorld{
public static void main(String[] args){
int sum = 0;
for (int i = 1;i <= 100;i++){
if (i%2 == 0){ //判定i為偶數(shù)
continue; //結(jié)束本次循環(huán)
}
sum += i; //計(jì)算累計(jì)和
}
System.out.println("sum = "+sum);
}
}

??上述代碼中,使用for循環(huán)讓變量i的值在1100之間循環(huán),在循環(huán)過程中,當(dāng)i的值為偶數(shù)時(shí),將執(zhí)行continue語(yǔ)句結(jié)束本次循環(huán),進(jìn)入下一次循環(huán)。當(dāng)i的值為奇數(shù)時(shí),sum和i進(jìn)行累加,最終得到1100之間所有奇數(shù)的和,打印“sum = 2500”。
??在嵌套循環(huán)語(yǔ)句中,continue語(yǔ)句后面也可以通過使用標(biāo)記的方式結(jié)束本次外層循環(huán),用法與break語(yǔ)句相似,在此不再舉例說(shuō)明。
3 流程控制語(yǔ)句(switch)
??switch 條件語(yǔ)句也是一種很常用的選擇語(yǔ)句,它和if條件語(yǔ)句不同,它只能針對(duì)某個(gè)表達(dá)式的值作出判斷,從而決定程序執(zhí)行哪一段代碼。例如,在程序中使用數(shù)字1~7來(lái)表示星期一到星期天,如果想根據(jù)某個(gè)輸入的數(shù)字來(lái)輸出對(duì)應(yīng)中文格式的星期值,可以通過下面的一段偽代碼來(lái)描述:
用于表示星期的數(shù)字
如果等于1,則輸出星期一
如果等于2,則輸出星期二
如果等于3,則輸出星期三
如果等于4,則輸出星期四
如果等于5,則輸出星期五
如果等于6,則輸出星期六
如果等于7,則輸出星期天
??對(duì)于上面一段偽代碼的描述,大家可能會(huì)立刻想到用剛學(xué)過得if…else if…else語(yǔ)句來(lái)實(shí)現(xiàn),但是由于判斷條件比較多,實(shí)現(xiàn)起來(lái)代碼過長(zhǎng),不便于閱讀。Java中提供了一種switch語(yǔ)句來(lái)實(shí)現(xiàn)這種需求,在switch語(yǔ)句中使用switch關(guān)鍵字來(lái)描述一個(gè)表達(dá)式,使用case關(guān)鍵字來(lái)描述和表達(dá)式結(jié)果比較的目標(biāo)值,當(dāng)表達(dá)式的值和某個(gè)目標(biāo)值匹配時(shí),會(huì)執(zhí)行對(duì)應(yīng)case下的語(yǔ)句。具體實(shí)現(xiàn)代碼如下:
switch (表達(dá)式){
case 目標(biāo)值1:
執(zhí)行語(yǔ)句1
break;
case 目標(biāo)值2:
執(zhí)行語(yǔ)句2
break;
......
case 目標(biāo)值n:
執(zhí)行語(yǔ)句n
break;
default:
執(zhí)行語(yǔ)句n+1
break;
}
??在上面的格式中,switch語(yǔ)句將表達(dá)式的值與每個(gè)case中的目標(biāo)值進(jìn)行匹配,如果找到了匹配的值,會(huì)執(zhí)行對(duì)應(yīng)case后的語(yǔ)句,如果沒找到任何匹配的值,就會(huì)執(zhí)行default后的語(yǔ)句。switch語(yǔ)句中的break關(guān)鍵字將在后面的做具體介紹,此處,我們只需要知道break的作用是跳出switch語(yǔ)句即可。
3.1 選擇結(jié)構(gòu)switch練習(xí)
??接下來(lái)通過一個(gè)案例演示根據(jù)數(shù)字來(lái)輸出中文格式的星期
public class HelloWorld{
public static void main(String[] args){
int week = 5;
switch (week){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("輸入的數(shù)字不正確...");
break;
}
}
}
運(yùn)行結(jié)果如圖所示

??在使用switch語(yǔ)句的過程中,如果多個(gè)case條件后面的執(zhí)行語(yǔ)句是一樣的,則該執(zhí)行語(yǔ)句只需書寫一次即可,這是一種簡(jiǎn)寫的方式。例如,要判斷一周中的某一天是否為工作日,同樣使用數(shù)字1~7來(lái)表示星期一到星期天,當(dāng)輸入的數(shù)字為1、2、3、4、5時(shí)就視為工作日,否則就視為休息日。接下來(lái)通過一個(gè)案例來(lái)實(shí)現(xiàn)上面描述的情況
public class HelloWorld{
public static void main(String[] args){
int week = 2;
switch (week){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("輸入的數(shù)字不正確...");
break;
}
}
}