張小飛的Java之路——第五章
寫在前面:
視頻是什么東西,有看文檔精彩嗎?
視頻是什么東西,有看文檔速度快嗎?
視頻是什么東西,有看文檔效率高嗎?
1. 流程控制語句
諸小亮:“接下來,我們就需要學習一下 Java 中的流程控制儀語句了”
張小飛:“什么是流程控制語句?”
“就是用來控制代碼執(zhí)行的,用文字不是很好表達,但是寫代碼一看,你就明白了”
1. 條件判斷語句
諸小亮:“來,我們先看第一種:條件判斷語句,在 Java 中使用 if 作為條件判斷”
格式:
1. 初體驗
“師弟,你先看看這段代碼:”

結果:

“原來這就是條件判斷啊,很簡單啊,如果 a<b = false,就不執(zhí)行 {} 中的代碼了吧”
“是的,不過這只是 if 的最基本用法,我們繼續(xù)看其他用法”
2. if...else...
諸小亮:“if 可以配合 else 使用,比如:”

結果:

“太簡單了,還有其他用法嗎?”
“還有最后一種”
3. else if
“可以配合 else if 使用,比如:”

結果:

“有點兒意思,師兄,我總結一下,您看看這樣理解對嗎?”
使用 if{} else if{} else{},最終肯定只有一對 {} 中的代碼能夠執(zhí)行
“確實是這樣的,不過需要注意一點:else if 可以在代碼中寫多個,比如:”

“原來還可以這樣,我知道了”
4. 簡寫方式
諸小亮:“if 還有一種簡寫方式,來我們也看看吧:”

張小飛:“真的可以嗎?我也來試試”
“拜托,把 ‘嗎?’換成 ‘!!’,就這么不想相信我?”
“怎么會不相信您呢?只是.....,師兄,不對吧,我這里編譯代碼時報錯了”

“怎么可能,讓我看看你的代碼”
“跟你的一模一樣,您看看”

“。。。,哪里一樣了,你在仔細看看:只有在 {} 中的代碼只有一句的時候,才能省略大括號”
“噢噢,不好意思,是我看錯了”
“另外,雖然可以省略大括號,但是,阿里的編碼規(guī)范規(guī)定,使用 if 必須得有 {}”
“這是為什么呢?”
“應該是為了增強代碼的可閱讀性吧,你以后寫的多了就明白了”
“好的,好的”
2. switch 語句
諸小亮:“來,我們接著看 switch 語句,其實準確來說應該是 swith case 語句”
張小飛:“這又是干什么的?”
“跟 if 類似,但又不一樣,是一種選擇結構語句”
“。。。,什么叫類似,又不一樣”
“我也不知道該怎么描述,還是看代碼吧(注意看代碼中的注釋)”
結果:

“原來是這樣,執(zhí)行到 break 后就跳出 switch 的大括號了”
“是的,其實 switch 并不是很重要,工作中也很少使用”
“那還講它干嘛?”張小飛問道
“雖然很少用,但還是有人用,別到時后看到了,不明白什么意思就糟了”
“哦,原來是這樣”
“師兄,如果把 break 去掉會怎么樣呢?就像這樣”

“這個,我就建議你自己跑一下,會讓你大吃一驚的”
“好,我來試試..........,結果竟然是這個樣子”

“為什么會輸出 B 呢,是不是我哪里寫的錯了”
諸小亮:“你沒有寫錯,我給你解釋一下吧”
switch 中的值與 case 的值相等時,開始執(zhí)行 case 后面的代碼,執(zhí)行到 break時,跳出 switch
語法上,break; 并不是必須的,就像你寫的那樣
輸出 B 的原因:第一個 case 匹配上后輸出 A,因為沒有 break,所以繼續(xù)往下執(zhí)行第二個 case 中的代碼,直到遇上break,如果所有case都沒有break,那么代碼執(zhí)行到switch語句結束
張小飛:“原來如此”
“但是,一般人為規(guī)定,每個 case 中都要有 break ”
“如果沒有一個 case 可以匹配上呢?”
“那就要加上 default 語句了,比如:”

結果:

,一般人為規(guī)定,switch中必須有一個default語句
“好的,我記下了”
“不不不不不不不不不不不不不...”
“哎,這是踩電線上了?”張小飛一邊問,一邊拉一下諸小亮
“我的意思是,這個東西不用記,只需要看到后能明白什么意思就行”
“好的,好的”
諸小亮:“既然說到了這里,那就再給你說兩個規(guī)則,這也不用記”
case后面的值不能重復,比如:

上圖代碼,編譯會報錯
switch 中的值可以是: byte、short、int、char、Enum、String 等類型
張小飛:“這個 Enum、String 是什么?”
“Enum是枚舉,String是字符串,這兩個東西我們會在之后的課程中說到”
3. 循環(huán)語句
諸小亮:“接著來看:循環(huán)語句(非常重要),開發(fā)中經(jīng)常用到”
張小飛:“那,具體什么是循環(huán)語句呢?”
諸小亮:“就是可以讓代碼重復執(zhí)行的語句”
1. while
諸小亮:“我們先看第一種:while”
語法:
張小飛:“這看著倒是跟 if 很像”
“是的,只不過,while的 { } 中的代碼會重復執(zhí)行”
1. 初體驗

“師弟,上圖代碼的執(zhí)行過程:”
先判斷 num >0 的結果,是否為 true
為 true,則執(zhí)行 { }中的代碼
然后再判斷num >0 結果,是否為true。。。。。。,一直這樣循環(huán)
如果num>0一直為 true ,則 { } 中的代碼就一直循環(huán)執(zhí)行,所以 { } 中的代碼又稱為:循環(huán)體
當 num >0 =false時,循環(huán)結束
張小飛:“按照您的說法,上圖中 while 的代碼會一直執(zhí)行啊,永遠停不下來”
諸小亮:“是的,這被稱為:死循環(huán),也是禁止出現(xiàn)的”
2. 死循環(huán)
諸小亮:“上圖代碼中 num > 0永遠是true,所以循環(huán)體會一直運行,這種情況稱為:死循環(huán)”
在實際開發(fā)中,死循環(huán)是禁忌,不允許出現(xiàn)
張小飛:“那,怎么才能避免死循環(huán)呢?”
“這就需要我們在循環(huán)體中修改 num 的值,從而可以讓 num>0 為 false,比如:”

結果:

“原來如此,我明白了”
3. 一個小練習
諸小亮:“既然你明白了,就做一個小練習吧,需求:計算1....100的連續(xù)自然數(shù)之和”
張小飛:“。。。。。?!?/span>
“我們先分析一下這個需求,它的計算邏輯應該是這樣的:”
先計算1+2=3,得到一個和(假設用 sum 表示這個和)
然后計算 sum+3,得到一個新的和(可以這樣寫:sum = sum + 3)
然后計算 sum + 4,。。。。。。。
然后計算 sum + 5,。。。。。。。
“我明白了,其實一直都是 sum 加上下一個數(shù),這是在重復運行”張小飛驚喜道
“是的,那么它的代碼應該是。。。。”
“我來,我來” 張小飛搶著說
結果:

諸小亮:“沒錯,不得不說你還是很有天賦的”
“那是”張小飛驕傲的說到
2. do while
張小飛:“這個 do while 也是循環(huán)?”
諸小亮:“是的,它跟 while 類似,只是寫法上有些不同,比如:”

結果:

“它的執(zhí)行過程,跟 while 還是有些差別的”
從 do 開始,先執(zhí)行循環(huán)體中的代碼
然后判斷 n > 0 是否為 true,為 true 就繼續(xù)執(zhí)行循環(huán)體
當 n >0 =false時,循環(huán)結束
“師兄,我知道差別在哪里了,do while中,循環(huán)體的代碼最少會執(zhí)行一次,比如:”
結果:

“沒錯,它跟 while 的區(qū)別就是:while 先判斷條件,do while 先執(zhí)行循環(huán)體再判斷條件”
3. for(重要)
諸小亮:“下面,就介紹最后一個 for 循環(huán)了,這是循環(huán)語句中最最最最最最最最最最最最最最重要的”
張小飛無奈道:“。。。,師兄,麻煩你正常點兒好不好?”
諸小亮:“這不是為了讓你知道 for 的重要性嘛,不識好人心”
“好好好,我錯了,您接著說”
1. 初體驗
“首先,看一下 for 的語法格式:”
張小飛:“嗯...,額...,完全沒有看懂”
“沒關系,跑個代碼你就明白了,比如:”
結果:

“大致可以看明白,但是詳細過程還得請您說一下”張小飛說到
“它的執(zhí)行過程其實也不難”
1. 首先執(zhí)行——初始化表達式
一般都是定義一個變量的初始值
注意:在 for 循環(huán)中,初始化表達式只執(zhí)行一次
2. 接著判斷循環(huán)條件,也就是執(zhí)行 i<3 這句代碼,如果為ture,就執(zhí)行循環(huán)體中的代碼
3. 然后執(zhí)行:操作表達式,緊接著從第 2 步開始重復
4. 當 i < 3 為 false 時,循環(huán)結束
“原來是這樣的,還挺簡單”
“確實不難,不過使用 for 時需要注意一點,看下圖:”

結果:

“這是為什么呢”張小飛問道
諸小亮:“這是因為:變量都是有作用域(作用范圍)的,for中定義的 i 變量,作用范圍僅限于for循環(huán)內部”
2. 過 7
諸小亮:“師弟,聽說你酒量不錯啊”
張小飛:“???師兄,怎么突然說喝酒的事情了,難道你要請我喝酒?”
“屁,想得美,你請我喝酒才是,我是想說,喝酒時你是不是經(jīng)常玩一個游戲,叫:過 7”
“是啊,但它已經(jīng)過時了,現(xiàn)在流行‘金陵十三釵’,這個游戲。。。”說起喝酒,張小飛就滔滔不絕起來
“停停停,扯遠了,回到代碼這里,我是想說根據(jù)目前的知識,能否寫段代碼, 找出1-100 中 7 的倍數(shù)?”
“這個...,是用 for 循環(huán)嗎?”
“沒錯,就用這個,給你提供個思路:如果數(shù)字除以7,余數(shù)是0,那么它就是7的倍數(shù)”
“好的,我琢磨一下”
3分鐘后。
“師兄,我寫出來了,你看看”
“嗯嗯,不錯不錯,早說你有天賦了”諸小亮贊揚道
“過獎,過獎,其實還好啦,也就是比諸葛亮先生多讀了本《三國演義》而已!”
“嗯?怎么感覺你在 cue 我,我還比林黛玉多看了本《紅樓夢》呢!”諸小亮反駁道
“不敢不敢,不過師兄,你真的看過紅樓夢?”
“怎么我看什么書還得跟你說一聲?”諸小亮狠狠的瞪了張小飛一眼回答道
“那你知道金陵十二釵正冊都有誰?”張小飛問道
“。。。。。。,就你話多”
3. for循環(huán)嵌套
張小飛:“這個 循環(huán)嵌套 是什么意思?”
諸小亮:“就是說:for 循環(huán)中還有 for 循環(huán),也稱為:雙層 for 循環(huán) 或者 多層 for 循環(huán)”
“師兄,是這樣嗎?”
“沒錯,使用雙層 for 循環(huán)時,最重要的是:得明白循環(huán)體執(zhí)行了多少次,來看看下面的代碼”
結果:

張小飛:“上圖中,x 輸出了 3 次,y 輸出了 12 次,我大概明白什么意思了”
諸小亮:“很好,那我們就繼續(xù)了”
4. println() 和 print();
諸小亮:“來,我們講點兒跟 for 無關的東西,System.out.print() ”
張小飛:“這個不就是輸出語句嗎?”
“你仔細看,咱們之前用的是 println() ,而現(xiàn)在是 print()”
“哦,還真是,這倆有什么區(qū)別?”
“很簡單:println():打印后換行,print():打印后不換行,給你演示一下就明白了”
結果:

“師弟,這個輸出結果能看明白嗎?”
“當然可以了,只是不明白為什么突然說起這個東西”
5. 打印 * 號
諸小亮:“因為,接下來我就要讓你看個編程題了”
張小飛:“編程題?什么意思?”
“給你一個任務:每一行打印 5 個 * 號,打印 3 行,要用雙層 for 循環(huán)實現(xiàn)”
“好的,我來試試”張小飛說到
“不,這個我來寫,你先看看”

“師弟,從結果中可以看出,一共是 3 行 5 列,對吧”
“嗯,是的,不過您具體是想表達什么意思呢?”
“其實是想讓你明白,代碼中:外層 for 控制的是行數(shù),內層 for 控制的是每行打印的內容”
“這樣啊,我明白了”
6. 練習一下
諸小亮:“既然你明白了,就嘗試下吧,寫代碼打印出下面的圖形”

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

張小飛:“這兩圖形挺有意思的,我就來試一下”
10分鐘后。
“師兄我已經(jīng)寫出來, 你看看,第一個圖形的代碼:”
“第二個圖形的代碼”
7. break
諸小亮:“下面講一下 break 語句 ”
張小飛:“是 switch case 中的 break 嗎?不是已經(jīng)說過了嗎?”
“是的 ,不過它也常常用在循環(huán)語句中”
break 的使用范圍:switch、循環(huán)語句(while、do while、for)
作用:跳出 switch 或 循環(huán)語句
“師兄,舉個例子吧”
“沒問題,你看看下面的代碼”

“原來是這樣用的,我明白了”
“但是,需要注意一種情況:”

結果:

“您是想說,break 語句后面不能在寫其他語句,因為無法執(zhí)行到,是這樣嗎?”
“聰明,另外,使用多層 for 的時候需要注意:break只能跳出一個循環(huán),比如:”
結果:

“明白,明白”
8. continue
張小飛:“這個 continue 是做什么的?”
諸小亮:“continue 也經(jīng)常在 循環(huán)語句 中用到,作用: 結束本次循環(huán),繼續(xù)下一次循環(huán)”
示例:(注意看代碼中的注釋)
結果:

“原來是這樣”張小飛說到
“好了,我們今天就先到這里吧,剩下的時間,你練習一下?”
“好的,雖然不難,但是東西確實挺多的,我再看看”