Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句詳解
【前言】
流程控制語句:
在一個(gè)程序執(zhí)行的過程中,各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的。也就是說程序的流程對(duì)運(yùn)行結(jié)果有直接的影響。所以,我們必須清楚每條語句的執(zhí)行流程。而且,很多時(shí)候我們要通過控制語句的執(zhí)行順序來實(shí)現(xiàn)我們要完成的功能。
流程控制語句分類:
順序結(jié)構(gòu)選擇結(jié)構(gòu):if語句、switch語句循環(huán)結(jié)構(gòu):while語句、for語句
一、順序結(jié)構(gòu):
是程序中最簡單最基本的流程控制,沒有特定的語法結(jié)構(gòu),按照代碼的先后順序,依次執(zhí)行,程序中大多數(shù)的代碼都是這樣執(zhí)行的。
總的來說:寫在前面的先執(zhí)行,寫在后面的后執(zhí)行
順序結(jié)構(gòu)圖:
二、選擇結(jié)構(gòu):
選擇結(jié)構(gòu):也被稱為分支結(jié)構(gòu)。選擇結(jié)構(gòu)有特定的語法規(guī)則,代碼要執(zhí)行具體的邏輯運(yùn)算進(jìn)行判斷,邏輯運(yùn)算的結(jié)果有兩個(gè),所以產(chǎn)生選擇,按照不同的選擇執(zhí)行不同的代碼。
Java語言提供了兩種選擇結(jié)構(gòu)語句:
if語句
switch語句
三、選擇結(jié)構(gòu)的if語句:
if語句有三種格式。下面具體來講解。
1、if語句第一種格式:(適合一種判斷)
執(zhí)行流程:
首先判斷關(guān)系表達(dá)式看其結(jié)果是true還是false:如果是true就執(zhí)行語句體;如果是false就不執(zhí)行語句體
其對(duì)應(yīng)的流程圖是:
注意事項(xiàng):
A:關(guān)系表達(dá)式無論簡單還是復(fù)雜,結(jié)果必須是boolean類型。
B:if語句控制的語句體如果是一條語句,大括號(hào)可以省略;如果是多條語句,就不能省略。建議永遠(yuǎn)不要省略。
C:一般來說:有左大括號(hào)就沒有分號(hào),有分號(hào)就沒有左大括號(hào)。
A:if(a==b && a==c){…}的特殊情況:
if(a == b){}寫成了if(a = b){}
這個(gè)時(shí)候如果是int類型就報(bào)錯(cuò)了。這個(gè)時(shí)候的意思是把b賦值給a,把a(bǔ)留下來判斷,而a是int類型的所以報(bào)錯(cuò)。
但是如果a,b都是boolean類型就沒有問題。
2、if語句第二種格式:(適合兩種判斷)
if(關(guān)系表達(dá)式) { 語句體1; }else { 語句體2; }
執(zhí)行流程:
首先判斷關(guān)系表達(dá)式看其結(jié)果是true還是false:如果是true就執(zhí)行語句體1;如果是false就執(zhí)行語句體2
其對(duì)應(yīng)的流程圖是:
我們前面講解過三元運(yùn)算符,它根據(jù)比較判斷后,給出的也是兩個(gè)結(jié)果,所以,這種情況和if語句的第二種格式很相似,他們在某些情況下應(yīng)該是可以相互轉(zhuǎn)換的。
if語句第二種格式和三元運(yùn)算符:
三元運(yùn)算符的操作都可以使用if語句改進(jìn),反之不成立。
什么時(shí)候不成立呢?當(dāng)if語句控制的語句體是一條輸出語句的時(shí)候,就不成立。因?yàn)槿\(yùn)算符是一個(gè)運(yùn)算符,必須要求有一個(gè)結(jié)果返回;而輸出語句卻不能作為一個(gè)返回結(jié)果。
3、if語句第三種格式:(適合多種判斷)
if語句第三種格式: if(關(guān)系表達(dá)式1) { 語句體1; }else if (關(guān)系表達(dá)式2) { 語句體2; } ... ... else { 語句體n+1; }
執(zhí)行流程:
首先判斷關(guān)系表達(dá)式1看其結(jié)果是true還是false
如果是true就執(zhí)行語句體1
如果是false就繼續(xù)判斷關(guān)系表達(dá)式2看其結(jié)果是true還是false
如果是true就執(zhí)行語句體2
如果是false就繼續(xù)判斷關(guān)系表達(dá)式…看其結(jié)果是true還是false
…
如果沒有任何關(guān)系表達(dá)式為true,就執(zhí)行語句體n+1。
其對(duì)應(yīng)的流程圖是:
需要注意的是,所有的語句體中,只執(zhí)行一個(gè)。
舉例:用if語句的嵌套,獲取三個(gè)數(shù)據(jù)中的最大值。代碼如下:
//用if語句實(shí)現(xiàn) int max1; if(a > b) { max1 = a; }else { max1 = b; } System.out.println("max1:"+max1);
三、選擇結(jié)構(gòu)的switch語句:
switch語句格式:
switch(表達(dá)式) { case 值1: 語句體1; break; case 值2: 語句體2; break; ... ... default: 語句體n+1; break; }
解釋:
switch表示這是switch語句
表達(dá)式的取值:byte,short,int,char(JDK5以后可以是枚舉,JDK7以后可以是String)(這句話可能出面試題)
case后面跟的是要和表達(dá)式進(jìn)行比較的值
語句體部分可以是一條或多條語句
break表示中斷,結(jié)束的意思,可以結(jié)束switch語句
default語句表示所有情況都不匹配的時(shí)候,就執(zhí)行該處的內(nèi)容,和if語句的else相似。
執(zhí)行流程:
首先計(jì)算出表達(dá)式的值;
其次,和case依次比較,一旦有對(duì)應(yīng)的值,就會(huì)執(zhí)行相應(yīng)的語句,在執(zhí)行的過程中,遇到break就會(huì)結(jié)束。
最后,如果所有的case都和表達(dá)式的值不匹配,就會(huì)執(zhí)行default語句體部分,然后程序結(jié)束掉。
流程圖:
注意事項(xiàng):
(1)case后面只能是常量,不能是變量,而且,多個(gè)case后面的值不能出現(xiàn)相同的
(2)default可以省略嗎?
可以省略。一般不建議。除非判斷的值是固定的(也就是說所有可能的情況都已經(jīng)列在case中了)
(3)break可以省略嗎?
可以省略,一般不建議。否則結(jié)果可能不是你想要的,會(huì)出現(xiàn)一個(gè)現(xiàn)象:case穿透。
(4)default的位置一定要在最后嗎?
可以出現(xiàn)在switch語句任意位置。
(5)switch語句的結(jié)束條件:
情況a:遇到break就結(jié)束,而不是遇到default就結(jié)束。
情況b:執(zhí)行到程序的末尾就結(jié)束
2、if和switch各自使用的場景:
在做判斷的時(shí)候,我們有兩種選擇,if語句和switch語句,那么,我們到底該如何選擇使用那種語句呢?
if語句使用場景:
針對(duì)結(jié)果是boolean類型的判斷
針對(duì)一個(gè)范圍的判斷
針對(duì)幾個(gè)常量值的判斷
switch語句使用場景:
針對(duì)幾個(gè)常量值的判斷
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納
這篇文章主要介紹了用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納,各種算法的實(shí)現(xiàn)也是ACM上經(jīng)常出現(xiàn)的題目,是計(jì)算機(jī)學(xué)習(xí)的基本功,需要的朋友可以參考下2015-08-08Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問題深入理解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之雙向鏈表、環(huán)形鏈表及約瑟夫問題深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解
這篇文章主要介紹了Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解,Set接口和java.util.List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對(duì)Collection接口進(jìn)行功能上的擴(kuò)充,只是比Collection接口更加嚴(yán)格了,需要的朋友可以參考下2024-01-01Spring實(shí)戰(zhàn)之獲取其他Bean的屬性值操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之獲取其他Bean的屬性值操作,結(jié)合實(shí)例形式分析了Spring操作Bean屬性值的相關(guān)配置與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12淺談@Aspect@Order各個(gè)通知的執(zhí)行順序
這篇文章主要介紹了@Aspect@Order各個(gè)通知的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java微服務(wù)實(shí)戰(zhàn)項(xiàng)目尚融寶接口創(chuàng)建詳解
這篇文章主要介紹了Java微服務(wù)實(shí)戰(zhàn)項(xiàng)目尚融寶的接口創(chuàng)建流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Spring中Websocket身份驗(yàn)證和授權(quán)的實(shí)現(xiàn)
在Web應(yīng)用開發(fā)中,安全一直是非常重要的一個(gè)方面,本文主要介紹了Spring中Websocket身份驗(yàn)證和授權(quán)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08