Java語法 | if選擇結(jié)構(gòu)

前言

C: 上一篇我們介紹了流程控制語句的概念色解,本篇我們要正式開始學(xué)習(xí)其中的選擇控制語句然评。那么在 Java 中颖榜,如果要實(shí)現(xiàn)選擇控制語句有哪些語法呢惊科?

本篇我們就來看看其中拍摇,在以后用的最多的一種選擇結(jié)構(gòu)語法:if 系列選擇結(jié)構(gòu)。

day03_1_9

基礎(chǔ)if選擇結(jié)構(gòu)

基礎(chǔ) if 選擇結(jié)構(gòu) 是 if 系列選擇結(jié)構(gòu)中馆截,最基礎(chǔ)的結(jié)構(gòu)語法授翻!它是最簡單的選擇結(jié)構(gòu),也只能用于一種流程分支的處理。

// 語法
// 條件往往是由關(guān)系運(yùn)算符來組成的判斷
// 條件的結(jié)果是一個boolean值堪唐,要么為true(真),要么為false(假)
if (條件) {
    // 條件為真時執(zhí)行的代碼塊
}
image-20210108112209731

案例需求:如果佩奇 Java 成績大于 90 分翎蹈,查老師將會獎勵她一部 OnePlus 8 Pro淮菠。

// 聲明一個變量用來存儲佩奇的Java成績
int score = 91;

// 套用基礎(chǔ)if語法
if (score > 90) {
    System.out.println("查老師獎勵了一部OnePlus 8 Pro。");
}

System.out.println("程序結(jié)束荤堪!");

查老師有話說: 套用下語法合陵,用用關(guān)系運(yùn)算符,就實(shí)現(xiàn)了一個很簡單的選擇案例澄阳,是不是很 easy拥知。

復(fù)雜條件的基礎(chǔ)if

接下來再看看下方案例中的條件,它就沒有那么容易了碎赢。

案例需求:如果喬治 Java 成績大于 90 分低剔,并且音樂成績大于 80 分時,或者 Java 成績等于 100 分肮塞,音樂成績大于 70 分時襟齿,查老師會獎勵他一部 OnePlus 8 Pro。

面對這種場景枕赵,單靠普通的關(guān)系運(yùn)算符顯然無法實(shí)現(xiàn)猜欺,結(jié)合邏輯運(yùn)算符就可以很好解決。

// 聲明變量分別存儲喬治的Java成績和音樂成績
int jScore = 60;
int mScore = 81;

// 關(guān)系運(yùn)算符結(jié)合邏輯運(yùn)算符
// 考慮到運(yùn)算符的優(yōu)先級拷窜,可以使用()來提升部分表達(dá)式的優(yōu)先級开皿,也是復(fù)雜條件下增加可讀性的方法
// ()的添加應(yīng)該成為一種本能,它是義務(wù)教育階段學(xué)數(shù)學(xué)后的條件反射
if ((jScore > 90 && mScore > 80) || (jScore == 100 && mScore > 70)) {
    System.out.println("查老師獎勵了一部OnePlus 8 Pro篮昧。");
}

System.out.println("程序結(jié)束嗦随!");

if-else選擇結(jié)構(gòu)

我們敲完上方的代碼發(fā)現(xiàn),如果條件不滿足的話粱栖,好像什么處理情況也沒有漓踢,這怎么可能,只有老師獎勵學(xué)生疚颊,沒有學(xué)生受罰狈孔?我們再來看個案例。

案例需求:如果蘇西 Java 考試成績大于 90 分材义,查老師就獎勵她一部 OnePlus 8 Pro均抽,否則就罰她給查老師買一部 OnePlus 8 Pro。

面對這個案例其掂,我們還是可以采用基礎(chǔ)If語法油挥。

// 條件成立情況
if (score > 90) {
    System.out.println("查老師獎勵了一部OnePlus 8 Pro。");
}

// 條件不成立情況
// if (score <= 90) {
    // System.out.println("蘇西哭著給查老師買了一部OnePlus 8 Pro,查老師很感動深寥。");
// }

// 還可以這么寫
// !表示取反攘乒,也就是某種情況的相反情況
if (!(score > 90)) {
    System.out.println("蘇西哭著給查老師買了一部OnePlus 8 Pro,查老師很感動惋鹅。");
}

但是明知道兩個結(jié)果是互斥的则酝,還要再寫一次判斷,并且條件越復(fù)雜闰集,寫起來就越麻煩沽讹。

例如:如果要基于剛才復(fù)雜條件的if案例來寫的話。

// 聲明變量分別存儲喬治的Java成績和音樂成績
int jScore = 60;
int mScore = 81;

// 成立
if ((jScore > 90 && mScore > 80) 
    || (jScore == 100 && mScore > 70)) {
    System.out.println("查老師獎勵了一部OnePlus 8 Pro武鲁。");
}

// 不成立的情況
if (!((jScore > 90 && mScore > 80) 
    || (jScore == 100 && mScore > 70))) {
    System.out.println("獎勵喬治給查老師買了一部OnePlus 8 Pro爽雄。");
}

System.out.println("程序結(jié)束!");

頭疼 沐鼠,這時候我們可以使用 if-else 語法來輕松解決這種條件互斥的情況挚瘟。if-else 選擇結(jié)構(gòu)可以處理簡單的互斥分支情況。

// 語法
if (條件) {
    // 代碼塊1
} else {
    // 代碼塊2
}
day03_1_11
image-20210108112715046

使用 if-else 來解決上述案例需求迟杂。

// 聲明一個變量存儲蘇西的Java考試成績
int score = 90;
// 套用if-else語法
// if:如果  else:否則
if (score > 90) {
    System.out.println("查老師獎勵了一部iPhone 11 Pro刽沾。");
} else {
    System.out.println("蘇西哭著給查老師買了一部OnePlus 8 Pro,查老師很感動排拷。");
}

查老師有話說: 實(shí)際上我們學(xué)的這些語法侧漓,在你念著案例時就能把代碼寫出來,如果(if)蘇西的 Java 考試成績(score)大于90分(> 90)监氢,查老師就獎勵她一部 OnePlus 8 Pro(System.out.println("xxx");)布蔗,否則(else)就罰她給查老師買一部 OnePlus 8 Pro(System.out.println("xxx");)。

多重if選擇結(jié)構(gòu)

我們掌握了 基礎(chǔ)if 來處理單分支選擇浪腐,也掌握了 if-else 來處理互斥分支纵揍,但是如果出現(xiàn)了更多種的分支情況怎么辦?

案例需求:如果佩奇 Java 考試成績大于等于 80 分议街,查老師就獎勵她一部 OnePlus 8 Pro泽谨,如果佩奇 Java 考試成績大于等于 60 分,查老師就獎勵她一部一加云耳特漩,否則就罰她給查老師買一部 iPhone 11 Pro吧雹。

面對此需求,if-else 只能處理互斥分支所以不能采用涂身,那使用 基礎(chǔ)if 的方案如下雄卷。

// 聲明一個變量存儲佩奇的Java考試成績
int score = 90;

if (score >= 80) {
    System.out.println("查老師獎勵她一部OnePlus 8 Pro。");
}

// 如果不添加&&來進(jìn)行限制蛤售,那么佩奇考試成績>80分時丁鹉,查老師將會破產(chǎn)
if (score >= 60 && score < 80) {
    System.out.println("查老師獎勵她一部一加云耳妒潭。");
}

if (score < 60) {
    System.out.println("佩奇哭著給查老師買了一部iPhone 11 Pro,查老師很感動揣钦。");
}

毫無疑問雳灾,基礎(chǔ)if 依然需要添加多次條件,但對于范圍型判斷來講拂盯,如果不把范圍控制好佑女,那么后續(xù)的 if 條件就會出現(xiàn)多余判斷的情況,因?yàn)槊總€ 基礎(chǔ)if 都是獨(dú)立的谈竿,Java 為此提供了一種簡化的方案:多重if選擇結(jié)構(gòu)

多重if選擇結(jié)構(gòu): 可以處理分段的條件分支情況摸吠,它是自上而下進(jìn)行選擇判斷空凸,只要有一個條件滿足,剩下的條件都不再執(zhí)行判斷 寸痢。所以不要隨意排列條件呀洲,把容易滿足的條件放在下方,不然容易滿足的條件判斷為 true 后啼止,后續(xù)其他條件都不會再判斷了道逗。

// 語法
if (條件1) {
    // 代碼塊1
} else if(條件2) { // 可以有多個else if
    // 代碼塊2
} else { // 可以省略
    // 代碼塊3
}
day03_1_13
// 存儲考試成績
int score = 90;

// 套用if - else if - else語句
/*
 * 注意事項(xiàng):
 *     1.else if 必須配合if使用,if只能寫一個献烦,else if可以寫很多個
 *     2.if-else if結(jié)構(gòu)是自上而下進(jìn)行判斷選擇的滓窍,只要上方的一個條件成立,下方的其他條件不再執(zhí)行
 *     3.可以結(jié)合else來使用巩那,當(dāng)上方所有條件都不成立時吏夯,就會執(zhí)行else代碼塊內(nèi)容
 */
if (score >= 80) {
    System.out.println("查老師獎勵她一部OnePlus 8 Pro。");
} else if (score >= 60) { // 不需要限制 < 80的條件了即横,因?yàn)橹灰?gt;=80噪生,就不再向下判斷
    System.out.println("查老師獎勵她一部一加云耳。");
} else {
    System.out.println("佩奇哭著給查老師買了一部iPhone 11 Pro东囚,查老師很感動跺嗽。");
}

嵌套if選擇結(jié)構(gòu)

生活在北上廣深的各位同學(xué)們,對早晚高峰的地鐵站印象很深了吧页藻?在乘坐地鐵前桨嫁,我們需要有兩次檢查,第一次是安全檢查惕橙,第二次是車票檢查瞧甩。火車站也是類似的弥鹦。

面對這種多次檢查肚逸,它的邏輯不是 多重If 這種自上而下依次執(zhí)行的判斷爷辙,而是當(dāng)通過第一層判斷后才可以進(jìn)入第二層判斷,面對這種場景朦促,我們可以把 if 語句再靈活使用一點(diǎn)膝晾。

day03_1_14

嵌套if 的應(yīng)用場景:在之前條件滿足的前提下,再增加額外的判斷 务冕。它可以通過外層語句和內(nèi)層語句的協(xié)作血当,增強(qiáng)程序的靈活性。在查老師看來禀忆,當(dāng)業(yè)務(wù)場景描述清楚的時候臊旭,福至心靈下就會自然而然的寫出來對應(yīng)的代碼了。

if (條件1) {
    if (條件2) 
        // 代碼塊1
    } else {
        // 代碼塊2
    }
} else {
    // 代碼塊3
}
day03_1_15

案例需求:學(xué)校舉行運(yùn)動會箩退,百米賽跑跑入10秒內(nèi)的學(xué)生有資格進(jìn)決賽离熏,然后根據(jù)性別進(jìn)入男子組或女子組

// 聲明一個變量存儲百米成績
int score = 9;
// 聲明一個變量存儲性別
String gender = "女";

// 套用嵌套if語句
// 注意事項(xiàng):如果沒有進(jìn)入決賽,也就不會分配組別了
if (score < 10) { // 可以進(jìn)入決賽
    System.out.println("進(jìn)入了決賽戴涝!");
    if ("男".equals(gender)) { // 分配組別
        System.out.println("進(jìn)入了男子組滋戳!");
    } else {
        System.out.println("進(jìn)入了女子組!");
    }
}

字符串的比較

大多數(shù)情況下啥刻,我們比較內(nèi)容時都會采用 == 這個關(guān)系運(yùn)算符奸鸯,但是如果遇到特殊類型,就不可以了可帽。

字符串的比較不要使用==娄涩,而是采用equals()方法。

查老師有話說: 介紹數(shù)據(jù)類型時蘑拯,查老師就說過 String 是個引用數(shù)據(jù)類型钝满,有點(diǎn)特別申窘。先了解,知道使用equals 方法來比較字符串內(nèi)容即可剃法。

// == 號可以比較基本數(shù)據(jù)類型的值是否相等(八大基本數(shù)據(jù)類型)
int num1 = 10;
int num2 = 10;
// System.out.println(num1 == num2); // true

char gender1 = '男';
char gender2 = '男';
// System.out.println(gender1 == gender2); // true

// ------------------

// 如果是字符串,不要使用==號比較贷洲,而是使用equals()方法
// 因?yàn)樽址且脭?shù)據(jù)類型收厨,==號如果比較引用數(shù)據(jù)類型优构,實(shí)際上比較的是數(shù)據(jù)的地址值而不是比較內(nèi)容
// 所以==很有可能導(dǎo)致你的字符串內(nèi)容比較出問題,因?yàn)樗容^的是地址值
// 即使你發(fā)現(xiàn)兩個字符串用==也比較為true了钦椭,那其實(shí)是涉及到常量池的概念了拧额。
// 先記住不要用==比較字符串就可以了1摺!侥锦!后期面向?qū)ο箅A段學(xué)完就知道為啥了恭垦。
String str1 = "我是一個字符串";
String str2 = "我是一個字符串";
System.out.println(str1.equals(str2));

查老師出題環(huán)節(jié)

光看不練假把式,來幾個練習(xí)番挺,練起來。

模擬登錄

使用 if 編寫程序:從鍵盤獲取用戶名和密碼没隘,如果用戶名和密碼都正確,那么就顯示"歡迎進(jìn)入xxx的世界!"赶熟,否則就提示"用戶名或密碼錯誤陷嘴!"。

提示:可以預(yù)先設(shè)定一個假的用戶名和密碼灾挨。

day03_5_1

人機(jī)猜拳

從控制臺輸入要出的拳劳澄,1代表石頭、2代表剪刀秒拔、3代表布,電腦 隨機(jī) 出拳作谚,比較勝負(fù)庵芭,完成此代碼功能。

day03_5_2
day03_5_3

隨機(jī)數(shù)的生成

隨機(jī)數(shù)是我們在程序中經(jīng)常要使用到的眨唬,前期我們可以用它模擬很多業(yè)務(wù),下面介紹一個 Java 中生成隨機(jī)數(shù)的玩法回官。

// Math.random()可以隨機(jī)生成[0.0,1.0)之間的小數(shù)
// [0.0,1.0)表示一個區(qū)間搂橙,等價于0.0 <= num1 < 1.0
// 左閉右開就是包含左邊數(shù)據(jù)歉提,不包含右邊的數(shù)據(jù)
// [0.0,1.0]也表示一個區(qū)間,等價于0.0 <= num1 <= 1.0
// 左閉右閉就是包含左邊數(shù)據(jù)区转,也包含右邊的數(shù)據(jù)
// 想了解更多區(qū)間的內(nèi)容,自己去百度下相關(guān)數(shù)學(xué)知識
double num1 = Math.random();

/*
 * 基于上方的方法废离,如果想指定生成某個范圍內(nèi)的隨機(jī)數(shù)蜻韭,可以推導(dǎo)出一個公式。
 * 隨機(jī)數(shù)公式為:(int)(Math.random() * (max - min)) + min;
 */
// 案例1:生成[0,10)之間的隨機(jī)整數(shù)
// [0.0,1.0) * 10 --> [0,10)
int num2 = (int)(Math.random() * 10);

// 案例2:生成[5,14)之間的隨機(jī)整數(shù)
int num3 = (int)(Math.random() * 9) + 5;

// 案例3:如果想生成[6,20]之間的隨機(jī)整數(shù)肖方,那可以將其理解為[6,21)俯画,這樣就可以再套上方的公式了
int num4 = (int)(Math.random() * 15) + 6;

幸運(yùn)抽獎

實(shí)現(xiàn)幸運(yùn)抽獎功能:輸入4位的會員號,如果會員號的百位數(shù)字等于產(chǎn)生的隨機(jī)數(shù)字艰垂,那么這個會員就是幸運(yùn)會員,將獎勵一部 iPhone 11 Pro娩怎!進(jìn)行合理結(jié)果提示拉宗。

提示:獲取4位數(shù),各個位的數(shù)字舉例:

int num = 1234;
// 千位
int qian = num / 1000;

// 百位
int bai = num / 100 % 10;

// 十位
int shi = num / 10 % 10;

// 個位
int ge = num % 10 % 10;

后記

選擇結(jié)構(gòu)的使用魁巩,一般不會困擾到大家姐浮。因?yàn)樗c我們?nèi)粘I钍欠浅YN近的,可讀性非常強(qiáng)肾扰。當(dāng)然如果還是不能理解,別忘了流程圖哈窗悯!

你們聽懂了嗎

查老師有話說: 對于技術(shù)的學(xué)習(xí)偷拔,查老師一貫遵循的步驟是:先用最最簡單的 demo 讓它跑起來,然后學(xué)學(xué)它的最最常用 API 和 配置讓自己能用起來欺旧,最后熟練使用的基礎(chǔ)上蛤签,在空閑時嘗試閱讀它的源碼讓自己能夠洞徹它的運(yùn)行機(jī)制,部分問題出現(xiàn)的原因称龙,同時借鑒這些技術(shù)實(shí)現(xiàn)來提升自己的代碼高度戳晌。

所以在查老師的文章中,前期基本都是小白文,僅僅穿插很少量的源碼研究竞帽。當(dāng)然等小白文更新多了屹篓,你們還依然喜歡,后期會不定時專門對部分技術(shù)的源碼進(jìn)行解析堆巧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍肤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子篷角,更是在濱河造成了極大的恐慌系任,老刑警劉巖虐块,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘉蕾,死亡現(xiàn)場離奇詭異,居然都是意外死亡儡率,警方通過查閱死者的電腦和手機(jī)航背,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門玖媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺像,你說我怎么就攤上這事错森。” “怎么了涩维?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵瓦阐,是天一觀的道長。 經(jīng)常有香客問我踏幻,道長戳杀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任隔缀,我火速辦了婚禮傍菇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘须妻。我一直安慰自己,他們只是感情好荒吏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布绰更。 她就那樣靜靜地躺著,像睡著了一般特恬。 火紅的嫁衣襯著肌膚如雪徐钠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天显拜,我揣著相機(jī)與錄音爹袁,去河邊找鬼。 笑死譬淳,一個胖子當(dāng)著我的面吹牛盹兢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼替裆,長吁一口氣:“原來是場噩夢啊……” “哼窘问!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惠赫,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎场晶,沒想到半個月后怠缸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳炬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年搔体,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劝术。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夯尽,死狀恐怖登馒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陈轿,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布蛾娶,位于F島的核電站潜秋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏罗售。R本人自食惡果不足惜钩述,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一牙勘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦色徘、人聲如沸最筒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邢锯。三九已至,卻和暖如春尾抑,著一層夾襖步出監(jiān)牢的瞬間蒂培,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工翎冲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳荒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓缴渊,卻偏偏與公主長得像鱼炒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子指蚁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容