選擇語(yǔ)句又稱(chēng)為分支語(yǔ)句,它通過(guò)對(duì)給定的條件進(jìn)行判斷,從而決定執(zhí)行兩個(gè)或多個(gè)分支中的哪一支。因此,在編寫(xiě)選擇語(yǔ)句之前,應(yīng)該首先明確判斷條件是什么,并確定當(dāng)判斷結(jié)果為“真”或“假”時(shí)應(yīng)分別執(zhí)行什么樣的操作/算法。在Java語(yǔ)言中選擇語(yǔ)句主要提供了兩個(gè),一個(gè)是if語(yǔ)句,另一個(gè)則是switch語(yǔ)句,我們先來(lái)看if語(yǔ)句。
if語(yǔ)句的編寫(xiě)方式我歸納為以下四種,請(qǐng)看下圖:
圖6-1:if語(yǔ)句語(yǔ)法格式
if語(yǔ)句是非常簡(jiǎn)單容易理解的,if被翻譯為如果,else被翻譯為其它,我們針對(duì)以上第二種寫(xiě)法進(jìn)行說(shuō)明:如果布爾表達(dá)式的結(jié)果是“真”,則執(zhí)行它后面的分支,反之則執(zhí)行else對(duì)應(yīng)的分支。好比說(shuō)“如果外面下雨了(真),出門(mén)則拿一把雨傘,反之則不帶雨傘”。再比如“如果你吃飽了(真)就不需要再吃了,反之則需要繼續(xù)吃東西”。那么以上兩個(gè)業(yè)務(wù)用代碼應(yīng)該如何實(shí)現(xiàn)呢?請(qǐng)看下面程序:
boolean raining = false;
if(raining){
System.out.println("外面下雨了,出門(mén)記得帶一把傘哦!");
}else{
System.out.println("天氣不錯(cuò)哦!");
}
boolean eatFull = true;
if(eatFull){
System.out.println("吃的好飽啊!");
}else{
System.out.println("還沒(méi)有吃飽,再來(lái)份米飯!");
}
上圖中第一種寫(xiě)法對(duì)應(yīng)的原理圖:
圖6-2:6-1圖中第一種寫(xiě)法對(duì)應(yīng)的原理圖
上圖中第二種寫(xiě)法對(duì)應(yīng)的原理圖:
圖6-3:6-1圖中第二種寫(xiě)法對(duì)應(yīng)的原理圖
上圖中第三種寫(xiě)法對(duì)應(yīng)的原理圖:
圖6-4:6-1圖中第三種寫(xiě)法對(duì)應(yīng)的原理圖
上圖中第四種寫(xiě)法對(duì)應(yīng)的原理圖:
圖6-5:6-1圖中第四種寫(xiě)法對(duì)應(yīng)的原理圖
通過(guò)以上原理的分析,我們可以得出if語(yǔ)句的任何一種形式在執(zhí)行的時(shí)候只要有一個(gè)分支執(zhí)行,則所對(duì)應(yīng)的整個(gè)if語(yǔ)句就全部結(jié)束了,換句話(huà)說(shuō),對(duì)于一個(gè)獨(dú)立的完整的if語(yǔ)句來(lái)說(shuō),最多只能有一個(gè)分支執(zhí)行。
另外,我們可以得出“圖6-1”中的四種寫(xiě)法,其中第二種和第四種都帶有else分支,所以這兩種寫(xiě)法我們可以確保肯定會(huì)有一個(gè)分支執(zhí)行,另外兩種寫(xiě)法則無(wú)法保證,也就是說(shuō)第一種和第三種這兩種寫(xiě)法可能一個(gè)分支都不會(huì)執(zhí)行,這兩種寫(xiě)法的分支是否執(zhí)行取決于條件是否為true。
還有,Java語(yǔ)言中有這樣一條規(guī)定:當(dāng)分支中只有一條java語(yǔ)句話(huà),大括號(hào)可以省略不寫(xiě),如以下程序:
boolean sex = true;
if(sex){
System.out.println("男");
}else{
System.out.println("女");
}
//也可以這樣寫(xiě)
if(sex)
System.out.println("男");
else
System.out.println("女");
雖然大括號(hào)可以省略,但是大家編寫(xiě)程序的時(shí)候一定要小心,分析以下程序錯(cuò)在哪里?
if(sex)
System.out.println("男");
System.out.println("hello world!");
else
System.out.println("女");
顯然if是沒(méi)有任何問(wèn)題的,輸出“男”也是沒(méi)問(wèn)題的,輸出“hello world!”也是正常的,只不過(guò)負(fù)責(zé)輸出“hello world!”的那一行代碼不在if語(yǔ)句的分支當(dāng)中,那么下面的else則缺少了if語(yǔ)句而編譯報(bào)錯(cuò)。換句話(huà)說(shuō),else以上的代碼都沒(méi)有問(wèn)題,錯(cuò)誤出現(xiàn)在else缺少了if。
雖然java規(guī)定當(dāng)分支中只有一條java語(yǔ)句的話(huà)大括號(hào)可以省略,但是為了程序具有很強(qiáng)的可讀性,所以建議在實(shí)際開(kāi)發(fā)中還是不要省略大括號(hào)會(huì)比較好。
那么,接下來(lái)我們給大家列舉幾個(gè)if語(yǔ)句的案例,幫助大家更好的理解和運(yùn)用if語(yǔ)句。
示例代碼1:業(yè)務(wù)背景:根據(jù)用戶(hù)輸入不同的數(shù)字來(lái)判斷用戶(hù)不同性別,當(dāng)輸入1時(shí)性別為男,當(dāng)輸入0時(shí)性別為女,輸入其它則不合法。
java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("請(qǐng)輸入數(shù)字:");
int i = scan.nextInt();
if(i == 1){
System.out.println("性別:男");
}else if(i == 0){
System.out.println("性別:女");
}else{
System.out.println("對(duì)不起,您輸入不合法!");
}
示例代碼2:業(yè)務(wù)背景:鍵盤(pán)接收一個(gè)學(xué)生的成績(jī),范圍在[0-100],根據(jù)成績(jī)判斷等級(jí),[90-100]等級(jí)為“優(yōu)秀”,[80-90)等級(jí)為“良好”,[70-80)等級(jí)為“中等”,[60-70)等級(jí)為“及格”,[0-60)等級(jí)為“大笨蛋”,輸入其它數(shù)字表示成績(jī)不合法。
java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("輸入考試成績(jī):");
int score = scan.nextInt();
if(score < 0 || score > 100){
System.out.println("對(duì)不起,您輸入的成績(jī)不合法!");
}else if(score >= 90 && score <= 100){
System.out.println("成績(jī)等級(jí):優(yōu)秀");
}else if(score < 90 && score >= 80){
System.out.println("成績(jī)等級(jí):良好");
}else if(score < 80 && score >= 70){
System.out.println("成績(jī)等級(jí):中等");
}else if(score < 70 && score >= 60){
System.out.println("成績(jī)等級(jí):及格");
}else if(score < 60 && score >= 0){
System.out.println("成績(jī)等級(jí):大笨蛋");
}
對(duì)于初學(xué)者來(lái)說(shuō)以上程序是可以的,但是對(duì)于老程序員來(lái)說(shuō),以上的代碼就太冗余了,我們將其進(jìn)行優(yōu)化,看以下代碼:
java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("輸入考試成績(jī):");
int score = scan.nextInt();
String grade = "大笨蛋";
if(score < 0 || score > 100){
grade = "對(duì)不起,您輸入的成績(jī)不合法!";
}else if(score >= 90){
grade = "優(yōu)秀";
}else if(score >= 80){
grade = "良好";
}else if(score >= 70){
grade = "中等";
}else if(score >= 60){
grade = "及格";
}
System.out.println("成績(jī)等級(jí):" + grade);
通過(guò)以上程序我們可以了解到一個(gè)功能的實(shí)現(xiàn)代碼有多種編寫(xiě)形式,大家在學(xué)習(xí)的時(shí)候千萬(wàn)別機(jī)械性的一行一行對(duì)抄代碼,實(shí)際上這種學(xué)習(xí)方法是非常痛苦,并且低效的,軟件開(kāi)發(fā)主要培養(yǎng)的是編程思想/編程思路,使用編程的思路解決現(xiàn)實(shí)生活中的問(wèn)題。當(dāng)然,對(duì)于初學(xué)者來(lái)說(shuō)我們不可能剛開(kāi)始就寫(xiě)出簡(jiǎn)單而高效的程序,這需要不斷的模仿,不斷的積累,尤其我們可以多參考高手寫(xiě)的程序(例如:JDK源代碼),當(dāng)你的代碼達(dá)到一定量的時(shí)候,你就可以出山了。
示例代碼3:業(yè)務(wù)背景:系統(tǒng)首先接收天氣參數(shù),1表示下雨天,0表示晴天,如果天氣是晴天,輸出“走起,一起出去玩耍嘍!”,當(dāng)天氣是下雨天,則繼續(xù)接收性別參數(shù),1表示男,0表示女,當(dāng)性別為女,則拿一把小花傘出去玩,當(dāng)性別為男,則拿一把大黑傘出去玩。
java.util.Scanner scann = new java.util.Scanner(System.in);
System.out.print("請(qǐng)輸入天氣指數(shù),1表示下雨天,0表示晴天:");
int weather = scann.nextInt();
if(weather == 1){
System.out.print("請(qǐng)?jiān)佥斎肽男詣e,1表示男,0表示女:");
int sex = scann.nextInt();
if(sex == 0){
System.out.println("女士,外面下雨了,您需要帶一把小花傘");
}else if(sex == 1){
System.out.println("哥們,外面下雨了,您需要帶一把大黑傘");
}else{
System.out.println("對(duì)不起,您輸入性別參數(shù)出錯(cuò)了!");
}
}else if(weather == 0){
System.out.println("走起,一起出去玩耍嘍!");
}else{
System.out.println("對(duì)不起,您輸入天氣參數(shù)出錯(cuò)了!");
}
運(yùn)行結(jié)果如下圖所示:
圖6-6:if語(yǔ)句嵌套演示
通過(guò)以上的程序我們得知,if語(yǔ)句是可以進(jìn)行嵌套使用的,也就是說(shuō)if語(yǔ)句的某個(gè)分支當(dāng)中還可以繼續(xù)編寫(xiě)其它if語(yǔ)句。實(shí)際上所有的控制語(yǔ)句都是可以進(jìn)行嵌套使用的。語(yǔ)句嵌套這個(gè)知識(shí)點(diǎn)本來(lái)是不需要拿來(lái)進(jìn)行特殊強(qiáng)調(diào)的,專(zhuān)門(mén)強(qiáng)調(diào)之后反而會(huì)讓初學(xué)者特殊對(duì)待,我希望大家不要特殊對(duì)待嵌套。雖然被嵌套的是一個(gè)控制語(yǔ)句,但這個(gè)控制語(yǔ)句也是一段普通的java程序,你說(shuō)呢!如下圖:
圖6-7:控制語(yǔ)句嵌套
總之,選擇語(yǔ)句之if語(yǔ)句,在實(shí)際開(kāi)發(fā)中使用頻率非常高,大家一定要掌握if語(yǔ)句的編寫(xiě)方式以及運(yùn)行原理,也可以自己想一些現(xiàn)實(shí)生活中的小例子加以練習(xí)。