自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 的流程控制是什么樣子的

開(kāi)發(fā) 后端
在這個(gè)過(guò)程里,你會(huì)發(fā)現(xiàn)你最終吃什么,取決于你的選擇。你要吃蘋(píng)果,你從冰箱里取蘋(píng)果,你要吃香蕉,你從冰箱里取香蕉。按選擇來(lái)控制,這也是一種流程。

[[401840]]

本文轉(zhuǎn)載自微信公眾號(hào)「蝸牛互聯(lián)網(wǎng)」,作者蝸?;ヂ?lián)網(wǎng)。轉(zhuǎn)載本文請(qǐng)聯(lián)系蝸?;ヂ?lián)網(wǎng)公眾號(hào)。

本文大綱:

為什么需要流程控制

平時(shí)我們做一件事,一般都會(huì)有個(gè)固定流程。

比如你想吃蘋(píng)果,你需要找到冰箱,打開(kāi)冰箱門(mén),取出蘋(píng)果,回到沙發(fā)上,然后開(kāi)吃。

這個(gè)順序基本不能調(diào)換,你不能在打開(kāi)冰箱門(mén)之前去取蘋(píng)果。按順序來(lái)控制,這是一種流程。

那如果你想吃香蕉,你會(huì)發(fā)現(xiàn)流程類(lèi)似,只是從冰箱里取出香蕉就好了。

在這個(gè)過(guò)程里,你會(huì)發(fā)現(xiàn)你最終吃什么,取決于你的選擇。你要吃蘋(píng)果,你從冰箱里取蘋(píng)果,你要吃香蕉,你從冰箱里取香蕉。按選擇來(lái)控制,這也是一種流程。

那還有種情況,一根香蕉不夠你吃,你還想吃幾根,直到你不想吃,那你就會(huì)重復(fù)上面的流程,當(dāng)你吃飽的時(shí)候,就終止了。這種重復(fù)執(zhí)行按照某個(gè)條件來(lái)終止的控制,也是一種流程。

計(jì)算機(jī)是現(xiàn)實(shí)世界的電子化表達(dá),那么在計(jì)算機(jī)的世界里,程序運(yùn)行也需要這樣的流程控制。

無(wú)論是機(jī)器語(yǔ)言,還是匯編語(yǔ)言,還是高級(jí)程序設(shè)計(jì)語(yǔ)言,都會(huì)涉及這個(gè)概念,它決定了你寫(xiě)的代碼會(huì)按照怎樣的路徑運(yùn)行,也決定著計(jì)算機(jī)和用戶之間的交互方式。

我們看看 Java 語(yǔ)言的流程控制是什么樣的?

輸入和輸出

我們編程都是為了解決某個(gè)實(shí)際問(wèn)題,比如寫(xiě)一個(gè)加法程序,我們是為了獲得兩個(gè)數(shù)的和是多少。

那你會(huì)發(fā)現(xiàn),程序有個(gè)重要的特點(diǎn),就是接收輸入,然后進(jìn)行處理,最后輸出結(jié)果。

那 Java 是怎么接收輸入的呢?

Scanner 介紹

Java 提供了 Scanner 工具類(lèi),我們可以通過(guò)這個(gè)工具類(lèi)來(lái)獲取用戶的輸入?;镜恼Z(yǔ)法如下:

  1. // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  2. Scanner scanner = new Scanner(System.in); 
  3.  
  4. // 讀取輸入的一行并獲取字符串 
  5. String nextLineStr = scanner.nextLine(); 
  6.  
  7. // 讀取輸入的字符串,會(huì)忽略掉字符串兩邊的空格,因?yàn)榭崭衿鸱指舴蚪Y(jié)束符的作用 
  8. String nextStr = scanner.next(); 
  9.  
  10. // 讀取輸入的整數(shù),非整數(shù)會(huì)拋異常(InputMismatchException) 
  11. int nextInt = scanner.nextInt(); 

System.in 是標(biāo)準(zhǔn)的輸入流,使用它可以接收鍵盤(pán)輸入或其他指定數(shù)據(jù)源的數(shù)據(jù)。

Scanner 是一個(gè)簡(jiǎn)單的文本掃描器,通過(guò)它可以解析基本類(lèi)型和字符串。new Scanner(System.in) 可以構(gòu)建出一個(gè)掃描器對(duì)象,scanner.nextLine()可以讀取輸入的一行并獲取字符串,scanner.next() 也可以獲取字符串,不過(guò)不能支持兩邊有空格的字符串,scanner.nextInt() 可以讀取輸入的整數(shù),int 換成其他基本類(lèi)型同樣也適用。

Scanner 使用

我們可以看下樣例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * 輸入演示 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class InputDemo { 
  12.  
  13.     public static void main(String[] args) { 
  14.  
  15.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  16.         Scanner scanner = new Scanner(System.in); 
  17.  
  18.         // 讀取輸入的一行并獲取字符串 
  19.         String nextLineStr = scanner.nextLine(); 
  20.  
  21.         // 讀取輸入的字符串,會(huì)忽略掉字符串兩邊的空格,因?yàn)榭崭衿鸱指舴蚪Y(jié)束符的作用 
  22.         String nextStr = scanner.next(); 
  23.  
  24.         // 讀取輸入的整數(shù),非整數(shù)會(huì)拋異常(InputMismatchException) 
  25.         int nextInt = scanner.nextInt(); 
  26.  
  27.         System.out.println("---以下為打印值---"); 
  28.         System.out.println("nextLineStr:" + nextLineStr); 
  29.         System.out.println("nextStr:" + nextStr); 
  30.         System.out.println("nextInt:" + nextInt); 
  31.  
  32.     } 

你會(huì)發(fā)現(xiàn),樣例代碼里有一個(gè) import java.util.Scanner; ,Scanner 是 Java 類(lèi)庫(kù)里的一個(gè)類(lèi),所以需要 import 語(yǔ)法引入一下,才能使用。

樣例代碼有三次控制臺(tái)輸入,我們輸入以下數(shù)據(jù)看下輸出:

  1. 我是蝸牛    
  2.    蝸牛666     

第一行輸入的字符串后邊有空格,第二行輸入的字符串前后都有空格。輸出如下:

---以下為打印值---

  1. ---以下為打印值--- 
  2. nextLineStr:我是蝸牛    
  3. nextStr:蝸牛666 
  4. nextInt:8 

你會(huì)發(fā)現(xiàn) nextLineStr 后邊的空格還在,nextStr 前后的空格都沒(méi)有了。

我們?cè)倏匆环N輸入:

  1. 我是蝸牛    
  2.    蝸牛666  7 

當(dāng)我們輸入兩行后,再回車(chē),程序就直接輸出結(jié)果了:

  1. nextLineStr:我是蝸牛    
  2. nextStr:蝸牛666 
  3. nextInt:7 

由此可見(jiàn) nextLine()和 next() 之間的不同,nextInt() 是 next() 基礎(chǔ)上的類(lèi)型轉(zhuǎn)換,特點(diǎn)可以認(rèn)為和 next() 一致。

  1. 起始符 分隔符 特點(diǎn) 
  2. nextLine()  任何字符    回車(chē)(Enter)   可以獲得帶空格的字符串 
  3. next()  非空白字符   空格  不能獲得帶空格的字符串 

輸出

在之前的代碼中,我們都是通過(guò) System.out.println() 的方式,把內(nèi)容輸出到控制臺(tái)的。

其中 System.out 是標(biāo)準(zhǔn)的輸出流,通過(guò)它不只可以做顯示輸出,也可以寫(xiě)入到指定的輸出目標(biāo),比如文件。

println 是 print line 的縮寫(xiě),表示輸出并換行。如果輸出不想換行,可以使用 print() 。此外,Java 也支持用 printf() 進(jìn)行格式化輸出,以方便閱讀。

以下是示例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. /** 
  4.  * 輸出演示 
  5.  * @author 蝸牛 
  6.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  7.  */ 
  8. public class OutputDemo { 
  9.  
  10.     public static void main(String[] args) { 
  11.  
  12.         // 輸出并換行 
  13.         System.out.println("---開(kāi)始演示---"); 
  14.         // 輸出不換行 
  15.         System.out.print("打印不換行["); 
  16.         System.out.print("1 "); 
  17.         System.out.print("2 "); 
  18.         System.out.print("3"); 
  19.         System.out.print("]"); 
  20.         // 只換行 
  21.         System.out.println(); 
  22.         // 格式化輸出 
  23.         double d = 66600000.8888; 
  24.         // 不進(jìn)行格式化的處理結(jié)果:6.66000008888E7 
  25.         System.out.println("不進(jìn)行格式化的處理結(jié)果:" + d); 
  26.         System.out.printf("默認(rèn)格式化:%f", d); 
  27.         System.out.printf("; 無(wú)小數(shù)格式化:%.0f", d); 
  28.         System.out.printf("; 一位小數(shù)格式化:%.1f", d); 
  29.         System.out.printf("; 兩位小數(shù)格式化:%.2f", d); 
  30.     } 

輸出結(jié)果如下:

  1. ---開(kāi)始演示--- 
  2. 打印不換行[1 2 3] 
  3. 不進(jìn)行格式化的處理結(jié)果:6.66000008888E7 
  4. 默認(rèn)格式化:66600000.888800; 無(wú)小數(shù)格式化:66600001; 一位小數(shù)格式化:66600000.9; 兩位小數(shù)格式化:66600000.89 

%f 就是 Java 為浮點(diǎn)數(shù)提供的格式化功能的占位符,系統(tǒng)默認(rèn)會(huì)把浮點(diǎn)數(shù)格式化成 6 位小數(shù)輸出,當(dāng)然你也可以仿照樣例指定小數(shù)位輸出。

除了浮點(diǎn)數(shù),Java 的格式化功能還提供了多種占位符,可以把各種數(shù)據(jù)類(lèi)型格式化成指定的字符串,以下是常用的占位符:

占位符 說(shuō)明
%d 格式化輸出整數(shù)
%x 格式化輸出十六進(jìn)制整數(shù)
%f 格式化輸出浮點(diǎn)數(shù)
%e 格式化輸出科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù)
%s 格式化字符串

注意,由于 % 表示占位符,因此,連續(xù)兩個(gè) %% 表示一個(gè) % 字符本身。

三種流程控制結(jié)構(gòu)

知道了輸入和輸出在 Java 世界里的表達(dá)方式,我們?cè)倏聪略诔绦蛱幚碇猩婕暗降牧鞒炭刂朴心男?/p>

順序結(jié)構(gòu)

程序基本的流程結(jié)構(gòu)就是順序結(jié)構(gòu),Java 也是如此。如果沒(méi)有特別指明,程序都是按照順序一行一行執(zhí)行。

選擇結(jié)構(gòu)

但很多時(shí)候,我們需要判斷一個(gè)東西是否可行,然后才去執(zhí)行一段邏輯。比如加法程序,我們得要求參與運(yùn)算的值是數(shù)字而不能是字符串。

那這樣的流程控制可以通過(guò)選擇結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

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

如果只是想針對(duì)某個(gè)條件特殊處理下,處理前后的邏輯不變,此時(shí)可以使用if單選擇結(jié)構(gòu)。

語(yǔ)法如下:

  1. if(布爾表達(dá)式){ 
  2.  //布爾表達(dá)式結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 

以下是打印兩個(gè)整數(shù)的最大值的示例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * if 單選擇結(jié)構(gòu) 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class IfSingleChoiceDemo { 
  12.  
  13.     public static void main(String[] args) { 
  14.  
  15.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  16.         Scanner scanner = new Scanner(System.in); 
  17.  
  18.         System.out.println("請(qǐng)輸入整數(shù)a:"); 
  19.         int a = scanner.nextInt(); 
  20.  
  21.         System.out.println("請(qǐng)輸入整數(shù)b:"); 
  22.         int b = scanner.nextInt(); 
  23.  
  24.         // 初始化最大值為 a 的值 
  25.         int max = a; 
  26.  
  27.         // b 比 a 大的請(qǐng)求下,把 b 的值賦給 max 
  28.         if (a < b) { 
  29.             max = b; 
  30.         } 
  31.         System.out.println("max:" + max); 
  32.     } 

我們用數(shù)字 a 初始化了變量 max,只有發(fā)現(xiàn) b 比 a 大的時(shí)候,才會(huì)把 b 的值賦給 max。也就是 當(dāng) a=10 并且 b=9 時(shí),if 花括號(hào)里的邏輯是走不到的,當(dāng) a=10 并且 b=11 時(shí),if 花括號(hào)里的邏輯會(huì)走到。

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

有時(shí)候我們遇到某個(gè)條件,會(huì)有兩種不同的邏輯,此時(shí)可以使用if雙選擇結(jié)構(gòu)。

語(yǔ)法如下:

  1. if(布爾表達(dá)式){ 
  2.  //布爾表達(dá)式結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 
  3. }else
  4.  //布爾表達(dá)式結(jié)果為 false 時(shí)執(zhí)行的語(yǔ)句 

以下是打印整數(shù)絕對(duì)值的示例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * if雙選擇結(jié)構(gòu) 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class IfDoubleChoiceDemo { 
  12.     public static void main(String[] args) { 
  13.  
  14.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  15.         Scanner scanner = new Scanner(System.in); 
  16.  
  17.         System.out.println("請(qǐng)輸入整數(shù)a:"); 
  18.         //10,-10 切換 
  19.         int a = scanner.nextInt(); 
  20.  
  21.         // 初始化絕對(duì)值變量 
  22.         int abs
  23.  
  24.         if (a < 0) { 
  25.             abs = -a; 
  26.         } else { 
  27.             abs = a; 
  28.         } 
  29.         System.out.println("abs:" + abs); 
  30.     } 

我們用 abs 初始化了絕對(duì)值變量,針對(duì)待判定的整數(shù) a,當(dāng)它的值是 10 或者 -10 時(shí),會(huì)走 if 的不同分支執(zhí)行不一樣的邏輯。

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

當(dāng)我們遇到的條件不只一個(gè)的時(shí)候,我們執(zhí)行邏輯的情況可能會(huì)超過(guò)兩個(gè),此時(shí)可以使用if多選擇結(jié)構(gòu)。

語(yǔ)法如下:

 

  1. if(布爾表達(dá)式1){ 
  2.  //布爾表達(dá)式1結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 
  3. }else if(布爾表達(dá)式2){ 
  4.  //布爾表達(dá)式2結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 
  5. }     
  6. else
  7.  //布爾表達(dá)式結(jié)果為 false 時(shí)執(zhí)行的語(yǔ)句 

以下是百分制成績(jī)?cè)u(píng)優(yōu)良差的示例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * if 多選擇結(jié)構(gòu) 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class IfMultiChoiceDemo { 
  12.  
  13.     public static void main(String[] args) { 
  14.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  15.         Scanner scanner = new Scanner(System.in); 
  16.  
  17.         System.out.println("請(qǐng)輸入你的成績(jī)(百分制):"); 
  18.  
  19.         //58,68,88,96,120 切換 
  20.         int score = scanner.nextInt(); 
  21.  
  22.         if (score > 0 && score < 60) { 
  23.             System.out.println("不合格"); 
  24.         } else if (score >= 60 && score < 80) { 
  25.             System.out.println("合格"); 
  26.         } else if (score >= 80 && score < 90) { 
  27.             System.out.println("良好"); 
  28.         } else if (score >= 90 && score <= 100) { 
  29.             System.out.println("優(yōu)秀"); 
  30.         } else { 
  31.             System.out.println("非法輸入"); 
  32.         } 
  33.     } 

成績(jī)分?jǐn)?shù)評(píng)優(yōu)良差的程序存在區(qū)間多級(jí)判斷,比較適合if多選擇結(jié)構(gòu)。

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

當(dāng)我們遇到的條件里,又能拆出多個(gè)條件,有不同的執(zhí)行邏輯時(shí),可以使用if嵌套選擇結(jié)構(gòu)。if嵌套選擇結(jié)構(gòu)可以認(rèn)為是if多選擇結(jié)構(gòu)的變種。

語(yǔ)法如下:

  1. if(布爾表達(dá)式1){ 
  2.  //布爾表達(dá)式1結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 
  3.      
  4.     if(布爾表達(dá)式2){ 
  5.         //布爾表達(dá)式2結(jié)果為 true 時(shí)執(zhí)行的語(yǔ)句 
  6.     } 

以下是百分制成績(jī)?cè)u(píng)優(yōu)良差變形后的示例代碼:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * if嵌套選擇結(jié)構(gòu) 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class IfNestChoiceDemo { 
  12.     public static void main(String[] args) { 
  13.  
  14.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  15.         Scanner scanner = new Scanner(System.in); 
  16.  
  17.         System.out.println("請(qǐng)輸入你的成績(jī)(百分制):"); 
  18.  
  19.         //58,68,88,96,120 切換 
  20.         int score = scanner.nextInt(); 
  21.  
  22.         if (score >= 0 && score <= 100) { 
  23.  
  24.             if (score < 60) { 
  25.                 System.out.println("不合格"); 
  26.             } else if (score < 80) { 
  27.                 System.out.println("合格"); 
  28.             } else if (score < 90) { 
  29.                 System.out.println("良好"); 
  30.             } else { 
  31.                 System.out.println("優(yōu)秀"); 
  32.             } 
  33.  
  34.         } else { 
  35.             System.out.println("非法輸入"); 
  36.         } 
  37.     } 

和普通的 if多選擇結(jié)構(gòu) 的代碼不同在于,if嵌套選擇做了兩層選擇,第一層是輸入的合法性,第二層是對(duì)成績(jī)做分級(jí)。

switch選擇結(jié)構(gòu)

我們有時(shí)候遇到的條件比較有限,并且就是判斷一個(gè)變量與一系列中某個(gè)值是否相等,然后命中不同的值,會(huì)走向不同的邏輯。此時(shí)就可以使用switch選擇結(jié)構(gòu)。

語(yǔ)法如下:

  1. switch(var){ 
  2.     case value1: 
  3.         // var 命中 value1 時(shí)執(zhí)行的語(yǔ)句 
  4.         break; 
  5.     case value2: 
  6.         // var 命中 value2 時(shí)執(zhí)行的語(yǔ)句 
  7.         break; 
  8.     //可以有任意數(shù)量的case語(yǔ)句 
  9.     // 默認(rèn)的請(qǐng)求,上邊都沒(méi)命中,會(huì)走到該分支 
  10.     default
  11.         //以上 case 都未命中或者未 break 會(huì)走到這里 

我們?nèi)绻焉线吿岬降膸讉€(gè)程序打包給用戶使用,那就可以通過(guò) switch 來(lái)提供統(tǒng)一的入口,引導(dǎo)用戶鍵入1來(lái)路由到求最大值的程序里,鍵入2路由到求絕對(duì)值的程序里,鍵入3路由到成績(jī)分?jǐn)?shù)評(píng)優(yōu)良差的程序里。示例代碼如下:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. import java.util.Scanner; 
  4.  
  5. /** 
  6.  * switch選擇結(jié)構(gòu) 
  7.  * 
  8.  * @author 蝸牛 
  9.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  10.  */ 
  11. public class IfSwitchChoiceDemo { 
  12.     public static void main(String[] args) { 
  13.  
  14.         // 用標(biāo)準(zhǔn)的輸入流構(gòu)建一個(gè) Scanner 對(duì)象 
  15.         Scanner scanner = new Scanner(System.in); 
  16.  
  17.         System.out.println("請(qǐng)選擇你要運(yùn)行的程序(鍵入1表示求最大值,鍵入2表示求絕對(duì)值,鍵入3表示成績(jī)分?jǐn)?shù)評(píng)優(yōu)良差):"); 
  18.  
  19.         int choice = scanner.nextInt(); 
  20.  
  21.         switch (choice) { 
  22.             case 1: 
  23.                 System.out.println("--開(kāi)始求兩個(gè)數(shù)的最大值--"); 
  24.                 IfSingleChoiceDemo.main(null); 
  25.                 break; 
  26.             case 2: 
  27.                 System.out.println("--開(kāi)始求絕對(duì)值--"); 
  28.                 IfDoubleChoiceDemo.main(null); 
  29.                 break; 
  30.             case 3: 
  31.                 System.out.println("--開(kāi)始成績(jī)分?jǐn)?shù)評(píng)優(yōu)良差--"); 
  32.                 IfMultiChoiceDemo.main(null); 
  33.                 break; 
  34.             default
  35.                 System.out.println("非法輸入"); 
  36.         } 
  37.     } 

跑一下這個(gè)程序,鍵入 1 你會(huì)發(fā)現(xiàn)開(kāi)始執(zhí)行求最大值的子程序里,最大值打印后整個(gè)程序就結(jié)束了,這說(shuō)明 break 起到了當(dāng)前分支阻斷程序的作用。一旦命中 break 代碼,后邊的 case 2、case 3、default 都不會(huì)走到。

當(dāng)然不是每個(gè) case 都需要有 break 的,當(dāng)你有兩個(gè) case 的邏輯一致,就可以忽略 break 進(jìn)行 case 合并,比如當(dāng)鍵入 4 的時(shí)候,我要求和 3 效果一致,可以改成下面這樣:

  1. case 3: 
  2. case 4: 
  3.     System.out.println("--開(kāi)始成績(jī)分?jǐn)?shù)評(píng)優(yōu)良差--"); 
  4.     IfMultiChoiceDemo.main(null); 
  5.     break; 

沒(méi)有 break 的 case 邏輯會(huì)穿透到下一個(gè) case,使用下一個(gè) case 的代碼邏輯。

注意,switch選擇結(jié)構(gòu)是if多選擇結(jié)構(gòu)特殊場(chǎng)景下的變種,JavaSE 8 支持的變量類(lèi)型有 byte、short、int、char、String、ENUM。

循環(huán)結(jié)構(gòu)

程序有時(shí)候會(huì)重復(fù)運(yùn)行一段邏輯,如果按順序結(jié)構(gòu)+選擇結(jié)構(gòu)來(lái)組織代碼的話,這種情況下需要寫(xiě)很多重復(fù)的代碼才能實(shí)現(xiàn)。比如我要得到從 1 到 5 的和:

  1. 1+2+3+4+5=? 

我的代碼可能就是這樣:

  1. package cn.java4u.flowcontrol; 
  2.  
  3. /** 
  4.  * while 循環(huán)結(jié)構(gòu)演示 
  5.  * 
  6.  * @author 蝸牛 
  7.  * @from 公眾號(hào):蝸?;ヂ?lián)網(wǎng) 
  8.  */ 
  9. public class WhileCircleDemo { 
  10.  
  11.     public static void main(String[] args) { 
  12.  
  13.         int a = 1; 
  14.         int sum = 0; 
  15.  
  16.         System.out.println("當(dāng)前a的值為:" + a); 
  17.         // a 累加到 sum 中 
  18.         sum = sum + a; 
  19.         // a 自身加一 
  20.         a = a + 1; 
  21.  
  22.         System.out.println("當(dāng)前a的值為:" + a); 
  23.         sum = sum + a; 
  24.         a = a + 1; 
  25.  
  26.         System.out.println("當(dāng)前a的值為:" + a); 
  27.         sum = sum + a; 
  28.         a = a + 1; 
  29.  
  30.         System.out.println("當(dāng)前a的值為:" + a); 
  31.         sum = sum + a; 
  32.         a = a + 1; 
  33.  
  34.         System.out.println("當(dāng)前a的值為:" + a); 
  35.         sum = sum + a; 
  36.          
  37.         System.out.println("sum:" + sum); 
  38.  
  39.     } 

你會(huì)發(fā)現(xiàn)重復(fù)邏輯很多,在 a = 5 的時(shí)候,累加才結(jié)束,結(jié)果才輸出。那如果有種機(jī)制能把這些重復(fù)的邏輯用簡(jiǎn)潔的方式表達(dá),那寫(xiě)代碼就會(huì)方便很多。

這種機(jī)制就是循環(huán)結(jié)構(gòu)。

while循環(huán)結(jié)構(gòu)

最常用的循環(huán)結(jié)構(gòu)是 while 循環(huán),語(yǔ)法如下:

  1. while(布爾表達(dá)式){ 
  2.  //循環(huán)內(nèi)容 
  • 只要布爾表達(dá)式為 true,循環(huán)就會(huì)一直執(zhí)行下去。
  • 我們大多數(shù)情況是會(huì)讓循環(huán)停止下來(lái)的,因此需要一個(gè)讓布爾表達(dá)式為 false 的方式來(lái)停止循環(huán)。
  • 少部分情況時(shí)需要循環(huán)一直執(zhí)行,比如服務(wù)器的請(qǐng)求響應(yīng)監(jiān)聽(tīng)等。
  • 循環(huán)條件如果一直是 true,就會(huì)造成無(wú)限循環(huán),應(yīng)盡量避免這種情況,否則會(huì)造成程序卡死崩潰。

用 while 來(lái)表達(dá)求和代碼如下:

  1. // 初始化值 
  2. a = 1; 
  3. sum = 0; 
  4.  
  5. while (a <= 5) { 
  6.     // a 累加到 sum 中 
  7.     sum += a; 
  8.     // a 自身加一 
  9.     a++; 
  10. System.out.println("while sum:" + sum); 

do while循環(huán)結(jié)構(gòu)

觀察 while 語(yǔ)句,你會(huì)發(fā)現(xiàn),只要不滿足條件,就不能進(jìn)入循環(huán)。但有時(shí)候我們需要即使不滿足條件,也至少要執(zhí)行一次。那此時(shí)用 do while 循環(huán)就比較合適,語(yǔ)法如下:

  1. do{ 
  2.  //循環(huán)內(nèi)容 
  3. }where(布爾表達(dá)式) 
  • 不同于 while 循環(huán)結(jié)構(gòu)的先判斷后執(zhí)行的方式,do while 循環(huán)結(jié)構(gòu)是先執(zhí)行后判斷。
  • do while 中的循環(huán)內(nèi)容會(huì)被至少執(zhí)行一次。

用 do while 來(lái)表達(dá)求和代碼如下:

  1. // 初始化值 
  2. a = 1; 
  3. sum = 0; 
  4.  
  5. do { 
  6.     // a 累加到 sum 中 
  7.     sum += a; 
  8.     // a 自身加一 
  9.     a++; 
  10. } while (a <= 5); 
  11. System.out.println("do while sum:" + sum); 

for循環(huán)結(jié)構(gòu)

在求和代碼中,我們會(huì)發(fā)現(xiàn),a 就像一個(gè)計(jì)數(shù)器,通過(guò) a = 1 初始化一個(gè)值,然后在每次循環(huán)中加一來(lái)當(dāng)成我們求和時(shí)要加的那個(gè)數(shù),a <= 5 作為計(jì)數(shù)器循環(huán)檢測(cè)條件,決定了我們的累加是加到 5 還是 100,只要改成 a <= 100,累加到 100 就不會(huì)再執(zhí)行循環(huán)。

這種其實(shí)是迭代處理的通用結(jié)構(gòu):初始值、終止條件和計(jì)數(shù)器。于是 Java 提供了 for 循環(huán)結(jié)構(gòu),用來(lái)簡(jiǎn)化這種場(chǎng)景下的 while 循環(huán),語(yǔ)法如下:

  1. for(計(jì)數(shù)器初始化; 布爾表達(dá)式; 循環(huán)后更新計(jì)數(shù)器){ 
  2.  //循環(huán)內(nèi)容 

用 for 來(lái)表達(dá)求和代碼如下:

  1. sum = 0; 
  2. for (a = 1; a <= 5; a++) { 
  3.     sum += a; 
  4. System.out.println("for sum:" + sum); 

for each循環(huán)結(jié)構(gòu)

有些時(shí)候,我們拿到一堆數(shù)處理,其實(shí)并不關(guān)心他們的次序,只要能遍歷到就可以。比如數(shù)組里的幾個(gè)值,我不關(guān)心值的索引,我只想知道這些值的總和是多少。此時(shí)就可以用 for each 循環(huán)結(jié)構(gòu),它可以很簡(jiǎn)單的遍歷數(shù)組,語(yǔ)法如下:

  1. for(元素類(lèi)型 元素變量 : 數(shù)組或迭代器){ 
  2.  //循環(huán)內(nèi)容 
  • for each 是對(duì) for 特殊場(chǎng)景下的簡(jiǎn)化,處理對(duì)象是數(shù)組或者迭代器對(duì)象。
  • 和 for 循環(huán)結(jié)構(gòu)相比,for each 循環(huán)結(jié)構(gòu)不再體現(xiàn)計(jì)數(shù)器的初始化和更新,因此也無(wú)法指定遍歷順序,也不能獲取數(shù)組或迭代器索引。

用 for each 來(lái)表達(dá)求和代碼如下:

  1. int[] array = {1, 2, 3, 4, 5}; 
  2. sum = 0; 
  3. for (int temp : array) { 
  4.     sum += temp
  5. System.out.println("for each sum:" + sum); 

循環(huán)結(jié)構(gòu)的中斷

循環(huán)結(jié)構(gòu)都會(huì)有個(gè)布爾表達(dá)式作為循環(huán)檢測(cè)條件,如果布爾表達(dá)式為 false 時(shí),就會(huì)終止循環(huán),這是循環(huán)中斷的一種方式。

除此之外,Java 還提供了另外兩種循環(huán)結(jié)構(gòu)中斷的方式。

一種是 break。語(yǔ)法如下:

  1. 循環(huán)結(jié)構(gòu){ 
  2.     //中斷前代碼 
  3.     if(中斷布爾表達(dá)式){ 
  4.   break; 
  5.     } 
  6.     //中斷后代碼 
  • 中斷布爾表達(dá)式返回 true 時(shí),命中 break ,直接退出整個(gè)循環(huán)結(jié)構(gòu),中斷后代碼不再執(zhí)行。

求和示例代碼如下:

  1. int a = 1; 
  2. int sum = 0; 
  3. while (a <= 5) { 
  4.  
  5.     // a 為 3 的時(shí)候中斷 
  6.     if (a == 3) { 
  7.         break; 
  8.     } 
  9.  
  10.     // a 累加到 sum 中 
  11.     sum += a; 
  12.     // a 自身加一 
  13.     a++; 
  14. System.out.println("while sum:" + sum); 

實(shí)際對(duì) 1 和 2 進(jìn)行求和,因?yàn)?a 為 3 的時(shí)候退出了循環(huán)。

注意:循環(huán)結(jié)構(gòu)如果存在嵌套,break 只會(huì)退出當(dāng)前層循環(huán)結(jié)構(gòu),不會(huì)退出外層循環(huán)結(jié)構(gòu)。

另一種是 continue,語(yǔ)法如下:

  1. 循環(huán)結(jié)構(gòu){ 
  2.     //中斷前代碼 
  3.     if(中斷布爾表達(dá)式){ 
  4.   continue
  5.     } 
  6.     //中斷后代碼 
  • 中斷布爾表達(dá)式返回 true 時(shí),命中 continue ,該循環(huán)結(jié)構(gòu)當(dāng)次調(diào)用中斷,中斷后代碼當(dāng)次不再執(zhí)行,進(jìn)入循環(huán)結(jié)構(gòu)的下次調(diào)用。

示例代碼如下:

  1. int i = 0; 
  2. while (i <= 5) { 
  3.     i++; 
  4.     // i 為 3 的時(shí)候中斷 
  5.     if (i == 3) { 
  6.         System.out.println("命中 continue"); 
  7.         continue
  8.     } 
  9.     System.out.println("i=" + i); 

輸出:

  1. i=1 
  2. i=2 
  3. 命中 continue 
  4. i=4 
  5. i=5 
  6. i=6 

會(huì)發(fā)現(xiàn) i 的值為 3 的時(shí)候命中 continue 邏輯,當(dāng)次循環(huán)不會(huì)繼續(xù)往下走,但會(huì)進(jìn)入下一次循環(huán)。

簡(jiǎn)單講,break 跳出當(dāng)前層循環(huán),循環(huán)結(jié)構(gòu)中止,continue 跳出當(dāng)次循環(huán)調(diào)用,當(dāng)次調(diào)用中止。二者都要配合 if 使用。

小結(jié)

 

本文從現(xiàn)實(shí)案例引出了流程控制的概念,映射到編程領(lǐng)域,我們把一個(gè)程序的執(zhí)行,抽象成輸入-處理-輸出的過(guò)程。然后介紹了在 Java 的世界里,輸入和輸出的實(shí)現(xiàn)方式,接著講解了在處理的過(guò)程中,常用的三種流程控制結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),并列出了演示代碼。讀者可以仿照案例實(shí)踐一把,相信你會(huì)有更深刻的印象。感謝你的閱讀和分享,歡迎留言互動(dòng)和點(diǎn)贊!

 

責(zé)任編輯:武曉燕 來(lái)源: 蝸牛互聯(lián)網(wǎng)
相關(guān)推薦

2021-02-19 10:14:49

云計(jì)算公共云

2022-10-10 08:47:49

ITCIO數(shù)據(jù)

2014-04-08 09:56:30

銷(xiāo)售易CRM

2020-11-04 11:17:20

好代碼程序員整潔

2021-11-29 07:42:44

CSS 技巧CSS 繪圖技巧

2021-05-08 13:11:58

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2024-03-04 09:19:33

CSSbackground前端

2021-10-04 15:46:31

網(wǎng)絡(luò)通信5G

2018-01-16 15:02:20

存儲(chǔ)RAIDSAN

2023-02-17 14:40:06

物聯(lián)網(wǎng)供應(yīng)鏈

2012-10-29 15:45:51

2021-03-24 15:25:44

AI

2021-09-30 19:12:46

通信網(wǎng)絡(luò)ADSL

2022-11-18 10:17:10

2019-09-03 14:57:33

智慧城市虛擬新加坡3D

2023-04-19 15:03:52

2011-10-10 11:04:54

2022-03-15 16:19:13

物聯(lián)網(wǎng)物聯(lián)網(wǎng) 2.0IoT

2021-05-31 09:26:01

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2012-07-12 13:27:56

互聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)