Java 流程控制
收錄更新:https://github.com/cunyu1943/JavaPark
目錄
前言
輸入輸出
輸入
輸出
順序結(jié)構(gòu)
分支結(jié)構(gòu)
if
switch
循環(huán)結(jié)構(gòu)
while
for
continue & break
break
continue
總結(jié)
前言
我們在 上一篇文章 中講了各種操作符的使用技巧,接上一篇文章中的內(nèi)容,本次文章主要將流程控制,文章主要內(nèi)容安排如下:
輸入輸出 順序結(jié)構(gòu) 分支結(jié)構(gòu) 循環(huán)結(jié)構(gòu)
輸入輸出
之前的學(xué)習(xí)中,我們會發(fā)現(xiàn)都是通過定義變量并賦初值的方式來得到一個實現(xiàn)固定好值的變量。假如我們現(xiàn)在不想再以這種方式獲取變量值,而想要直接控制變量值,又該怎么做呢?這就涉及到 Java 中的輸入輸出相關(guān)知識了,以下就先來看看,如何實現(xiàn)從控制臺輸入,并從控制臺輸出吧。
輸入
先來看一個實例:
import java.util.Scanner;
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 13:53
* @description : 輸入
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("輸入整型");
int num = scanner.nextInt();
System.out.println("輸入的整型:" + num);
System.out.println("輸入字符型");
String name = scanner.next();
System.out.println("輸入的字符型:" + name);
System.out.println("輸入浮點型");
float floatNum = scanner.nextFloat();
System.out.println("輸入的字符型:" + floatNum);
double doubleNum = scanner.nextDouble();
System.out.println("輸入的字符型:" + doubleNum);
}
}

要實現(xiàn)從控制臺輸入并讀取到我們的程序中時,需要借助 Scanner 類,它屬于標(biāo)準(zhǔn)輸入流,其步驟總結(jié)如下:
首先,需要導(dǎo)入 Scanner類。即import java.util.Scanner,其中import表示導(dǎo)入某個類,并且只能放在程序的開頭。然后創(chuàng)建 Scanner對象。這里需要注意,創(chuàng)建時需要傳入System.in,表示標(biāo)準(zhǔn)輸入流,與之對應(yīng)的System.out則代表標(biāo)準(zhǔn)輸出流。最后就是讀取用戶輸入即可。這里讀取時,調(diào)用不同的方法 Scanner會自動轉(zhuǎn)換數(shù)據(jù)類型,不用我們?nèi)ミM行手動轉(zhuǎn)換。
從控制臺獲取不同類型的輸入,其常用方法如下:
| 返回值 | 方法名 | 描述 |
|---|---|---|
boolean | hasNext() | 如果還有輸入,則返回 true,否則返回 false |
String | next() | 返回輸入的字符串,以空格為分隔符 |
String | nextLine() | 返回輸入的字符串,以換行為分隔符 |
int | nextInt() | 輸入整型數(shù) |
long | nextLong() | 輸入長整型數(shù) |
float | nextFloat() | 輸入單精度數(shù) |
double | nextDouble | 輸入雙精度數(shù) |
這里值得注意的是 next() 和 nextLine 兩個方法,雖然他們的作用都是用于獲取輸入的 String 類型的內(nèi)容,但是它們具體的處理機制又會有所區(qū)別。針對 next() 而言,它會自動消除有效字符前的空格,從而只返回輸入的字符,得到的字符串都不會帶有空格。也就是說,當(dāng)使用 next() 時,如果遇到空格,此時就會停止錄入,只錄入空格前的內(nèi)容,而空格后的內(nèi)容則會保留到緩沖區(qū)。除了空格之外,next() 也會對制表符和換行符采用同樣的處理方式。而對 nextLine() 來說,它會返回換行符之前的所有內(nèi)容,甚至是帶空格的字符串。
因此,在使用時一定要注意它們之間的區(qū)別,合理搭配使用,從而得到自己想要的結(jié)果。
輸出
其實從一開始的 hello world 到目前的代碼中,我們已經(jīng)接觸過輸出了,也就是我們的 System.out.println()。
其中 println 表示輸出并換行,如果我們不想換行,則使用 print 就可以了。
通過上述方式所輸出的內(nèi)容都是擠在一起的,十分不方便我們閱讀。為了更加清晰的打印出我們所需要的結(jié)果,可以使用格式化輸出。
要使用格式化輸出,需要使用 System.out.printf() 或者 System.out.format() 搭配占位符,然后在后面的參數(shù)格式化成指定格式即可,兩者達成的效果是等價的。常見的占位符如下:
| 占位符 | 描述 |
|---|---|
%d | 格式化輸出整數(shù) |
%f | 格式化輸出浮點數(shù) |
%s | 格式化輸出字符串 |
%x | 格式化輸出十六進制整數(shù) |
%e | 格式化輸出科學(xué)計數(shù)法表示的浮點數(shù) |
此外,我們還可以使用各種轉(zhuǎn)義字符來使得我們的輸出更為簡潔,常見的轉(zhuǎn)義字符及意義如下表所示。
| 轉(zhuǎn)義字符 | 描述 |
|---|---|
\n | 換行 |
\t | 水平制表符 |
\\ | 表示一個反斜杠 |
\' | 表示一個單引號 |
\" | 表示一個雙引號 |
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 14:48
* @description : 輸出
*/
public class Main {
public static void main(String[] args) {
int num1 = 10;
double num2 = 34.9;
float num3 = 3.34f;
String name = "村雨遙";
// 換行及不換行輸出
System.out.println("公眾號:" + name);
System.out.print("公眾號:" + name);
System.out.println(num1);
// 格式化輸出
System.out.println("格式化輸出:");
System.out.printf("num1 = %d\n", num1);
System.out.format("num2 = %f\t num3 = %f\n", num2, num3);
System.out.printf("name = %s\n", name);
System.out.format("name = %s\n", name);
}
}

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

順序結(jié)構(gòu)如上圖所示,它可以說是最簡單的,只需要按照解決問題的順序?qū)懗鰧?yīng)的語句即可,其執(zhí)行順序是自上而下,依次執(zhí)行的。就類似于我們求解一道數(shù)學(xué)題,你得根據(jù)題意一步一步來,直至解出最后的答案。
分支結(jié)構(gòu)
上圖是分支結(jié)構(gòu),順序結(jié)構(gòu)雖然能夠處理計算、輸出等問題,當(dāng)遇到需要判斷選擇時,順序結(jié)構(gòu)已經(jīng)不能很好的解決了,此時就需要使用分支結(jié)構(gòu)。Java 中,分支結(jié)構(gòu)相關(guān)的語句主要涉及到 if 和 switch 相關(guān),下面就分別來看一下。
if
單次判斷
當(dāng)我們只進行一次判斷時,可以使用一個 if 語句包含一個條件表達式,其語法格式如下;
if(條件表達式){
執(zhí)行語句;
}
其執(zhí)行邏輯如下圖所示,如果條件表達式的值為 true,則執(zhí)行 if 語句塊中的執(zhí)行語句,否則就執(zhí)行 if 語句塊后邊的代碼;

多次判斷
要進行多次判斷時,可以使用 if…else 的形式,其語法格式如下;
if(條件表達式 1){
執(zhí)行語句 1;
} else if(條件表達式 2){
執(zhí)行語句 2;
} else if(…){
…
}…
其執(zhí)行邏輯如下圖所示,如果條件表達式 1 為 true,則執(zhí)行執(zhí)行語句 1,否則接著判斷條件表達式 2,若為 true,則執(zhí)行執(zhí)行語句 2,以此類推,直到完成最后一個條件表達式的判斷。

import java.util.Scanner;
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 15:45
* @description : 條件判斷
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入分數(shù):");
double score = scanner.nextDouble();
if (score < 0 || score > 100) {
System.out.println("輸入的分數(shù)不在0-100之間,不符合要求");
} else if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 60) {
System.out.println("C");
} else {
System.out.println("D");
}
}
}

switch
當(dāng)我們需要使用 if 進行判斷時,難免顯得有些繁瑣。此時,我們就可以使用 switch 來進行替代,通過判斷一個變量所屬范圍,從而劃分出不同的分支。
switch 分支的語法格式如下:
switch(表達式){
case value1:
執(zhí)行語句1;
break;
case value2:
執(zhí)行語句2;
break;
……
default:
執(zhí)行語句;
break;
}
通過判斷表達式的值,然后執(zhí)行對應(yīng)值下的執(zhí)行語句,而 default 下的執(zhí)行語句表示如果 switch 表達式未匹配到對應(yīng)的值時所執(zhí)行的語句;
一個 switch 的實例如下:
import java.util.Scanner;
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/15 15:49
* @description : switch
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("請輸入該學(xué)生成績:");
int grade = input.nextInt();//定義grade且獲取鍵盤輸入的整數(shù)
if (grade < 0 || grade > 100) {//輸入的整數(shù)范圍應(yīng)為0-100
System.out.println("輸入的成績有誤");
return;
}
switch (grade / 10) {
case 10:
case 9:
System.out.println("該學(xué)生成績優(yōu)秀");
break;
case 8:
System.out.println("該學(xué)生成績良好");
break;
case 7:
System.out.println("該學(xué)生成績中等");
break;
case 6:
System.out.println("該學(xué)生成績基本合格");
break;
default:
System.out.println("該學(xué)生成績不合格");
break;
}
}
}
而在使用 switch 分支語法時,需要遵循一定的規(guī)則:
switch中的變量類型可以是:byte、short、int、char、String(自 JDK 1.7 開始);switch語句根據(jù)表達式的結(jié)果跳轉(zhuǎn)到對應(yīng)的case結(jié)果,然后執(zhí)行其后跟著的語句,直到遇到break才結(jié)束執(zhí)行;默認情況下,一般都會跟著一個 default的分支,用于未匹配到對應(yīng)情況時的執(zhí)行情況;
循環(huán)結(jié)構(gòu)
上圖為循環(huán)結(jié)構(gòu)示意,讓程序中遇到需要反復(fù)執(zhí)行某一個功能時,我們發(fā)現(xiàn)順序結(jié)構(gòu)以及分支結(jié)構(gòu)實現(xiàn)起來都太過于繁瑣,于是又提出了循環(huán)結(jié)構(gòu)的相關(guān)概念。通過循環(huán)結(jié)構(gòu),我們就可以通過判斷循環(huán)語句,然后判斷是否進入循環(huán)體。Java 中,循環(huán)結(jié)構(gòu)主要涉及的語句有 while、for、continue、break 等。
while
假設(shè)我們現(xiàn)在有一個題目,需要你計算 1 + 2 + 3 + …… + 50 的結(jié)果,你會怎么辦呢?
這么寫么:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 9:35
* @description : while
*/
public class Main {
public static void main(String[] args) {
int sum = 1 + 2;
sum += 3;
sum += 4;
……
sum += 50;
System.out.println("1 + 2 + 3 + …… + 50 = " + sum);
}
}
這么寫就太麻煩了,計算到 50 的值就已經(jīng)很多了,假如有 1000,10000 甚至更大,那我們豈不是寫個好久才能寫完。這個時候我們就得找找有沒有簡單的方法,能夠只寫幾句就實現(xiàn)相同的效果呢?答案是:Yes,這就是我們這一小節(jié)將要講到的循環(huán)。
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 9:35
* @description : while
*/
public class Main {
public static void main(String[] args) {
int sum = 0;
int num = 1;
while (num <= 50) {
sum += num;
num++;
}
System.out.println("1 + 2 + 3 + …… + 50 = " + sum);
}
}

從上面的實例,利用 while 循環(huán),我們就能輕易達成循環(huán)的效果。其語法格式如下:
while(表達式){
執(zhí)行語句;
}
只要表達式為 true,就會不斷循環(huán)執(zhí)行其中的執(zhí)行語句,直到表達式為 false,此時便跳出循環(huán),不再執(zhí)行其中的執(zhí)行語句。
除開上面的形式之外,還有另一種 while 形式:
do{
執(zhí)行語句;
}while(表達式);
兩者的最大區(qū)別在于:do……while 無論 表達式 是否為 true,都至少會執(zhí)行一次。
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 9:35
* @description : while
*/
public class Main {
public static void main(String[] args) {
int sum = 0;
int num = 10;
while (num <= 9) {
sum += num;
num++;
}
System.out.println("sum = " + sum);
}
}

/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 9:35
* @description : while
*/
public class Main {
public static void main(String[] args) {
int sum = 0;
int num = 10;
do {
sum += num;
num++;
} while (num < 10);
System.out.println("sum = " + sum);
}
}

觀察以上兩個實例,在 while 程序中,我們定義 num = 10,然后假設(shè) num <= 9 時就進入循環(huán)體,而 ,所以不進入循環(huán)體,直接打印 sum 的值為 0。而在 do…while 程序中,我們同樣定義 num = 10,然后假設(shè) num < 10 時繼續(xù)循環(huán),很明顯不滿足該情況,理應(yīng)跳出循環(huán),打印出 sum 的值為 10,說明此時還是進行了一次循環(huán)。
因此,當(dāng)我們需要在 while 和 do……while 之間做出選擇時,如果我們最少需要進行一次循環(huán),則選擇 do……while,其他情況下選用兩者都可以。
for
普通 for 循環(huán)
除開 while 和 do……while 之外,我們還有 for 循環(huán)來達成同樣的結(jié)果,只是表達方法不一樣。同樣以上面計算 1 + 2 + …… + 50 為例,可以寫成如下的形式:
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 10:20
* @description : for 循環(huán)
*/
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int num = 1; num <= 50; num++) {
sum += num;
}
System.out.println("1 + 2 + …… + 50 = " + sum);
}
}

for 循環(huán)的語法形式如下:
for(初始條件;終止條件;更新語句){
循環(huán)語句;
}
for 循環(huán)的執(zhí)行步驟如下:
首先執(zhí)行初始條件,可以聲明一種類型,但可以初始化一個或多個循環(huán)控制變量,甚至可以放空; 接著判斷終止條件,如果為 true,則進入循環(huán)體執(zhí)行循環(huán)語句;如果為false,則終止循環(huán),執(zhí)行循環(huán)體后面的語句;一次循環(huán)完成后,執(zhí)行更新語句來更新循環(huán)控制變量; 最后再次判斷終止條件,循環(huán)以上三個步驟;
for 和 while 最大的區(qū)別就在于 for 循環(huán)一般都是事先知道需要循環(huán)的次數(shù)的,而 while 循環(huán)則不需要。
增強 for 循環(huán)
自 Java 5 后,引入了一種增強型 for 循環(huán),主要用于數(shù)字遍歷,其語法格式如下:
for(聲明語句:表達式){
// 循環(huán)語句
}
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 10:39
* @description : 增強 for 循環(huán)
*/
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 4, 5, 6, 9, 10};
for (int number : numbers) {
System.out.print(number + "\t");
}
}
}

其中,聲明語句一般是聲明一個同數(shù)組數(shù)據(jù)類型相同的局部變量,而表達式則是要訪問的數(shù)組名或者返回值是數(shù)組的方法。
continue & break
break
主要用在循環(huán)語句或者 switch 語句中,表示跳出最里層的循環(huán),然后繼續(xù)執(zhí)行該循環(huán)下的語句。
break 在 switch 語句中的用法已經(jīng)見識過了,我們就來看看它在循環(huán)中的應(yīng)用。
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 10:51
* @description : break & continue
*/
public class Main {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
System.out.println("i = " + i);
if (i == 5) {
break;
}
}
}
}

觀察結(jié)果可知,當(dāng) i == 5 時,我們執(zhí)行了 break 語句,此時就直接跳出了 for 循環(huán),而不再進行下一次的循環(huán)。
continue
continue 也同樣是應(yīng)用在循環(huán)控制結(jié)構(gòu)中,主要是讓程序跳出當(dāng)次循環(huán),進而進入下一次循環(huán)的迭代。
在 for 循環(huán)中,執(zhí)行 continue 語句后,直接跳轉(zhuǎn)到更新語句,而不再執(zhí)行 continue 后的語句。而在 while 或 do……while 循環(huán)中,執(zhí)行 continue 語句后,直接跳轉(zhuǎn)到表達式的判斷。
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 10:51
* @description : break & continue
*/
public class Main {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
if (i == 5) {
continue;
}
System.out.println("i = " + i);
}
}
}

觀察上述結(jié)果可知,當(dāng) i == 5 時,我們執(zhí)行了 continue 語句,此時便跳出了當(dāng)次循環(huán),不再進行后邊的打印語句,然后繼續(xù)下一次的循環(huán),所以最終打印的結(jié)果沒有 5.
總結(jié)
今天的內(nèi)容到此就結(jié)束了,老規(guī)矩,如果大家覺得有用的話,就給個點贊關(guān)注吧!
其次就是對于文中遺漏或者存在欠缺的知識點,還請大家不吝賜教,在評論區(qū)指出來!
- END -