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é)
前言
我們?cè)?上一篇文章 中講了各種操作符的使用技巧,接上一篇文章中的內(nèi)容,本次文章主要將流程控制,文章主要內(nèi)容安排如下:
輸入輸出 順序結(jié)構(gòu) 分支結(jié)構(gòu) 循環(huán)結(jié)構(gòu)
輸入輸出
之前的學(xué)習(xí)中,我們會(huì)發(fā)現(xiàn)都是通過(guò)定義變量并賦初值的方式來(lái)得到一個(gè)實(shí)現(xiàn)固定好值的變量。假如我們現(xiàn)在不想再以這種方式獲取變量值,而想要直接控制變量值,又該怎么做呢?這就涉及到 Java 中的輸入輸出相關(guān)知識(shí)了,以下就先來(lái)看看,如何實(shí)現(xiàn)從控制臺(tái)輸入,并從控制臺(tái)輸出吧。
輸入
先來(lái)看一個(gè)實(shí)例:
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("輸入浮點(diǎn)型");
float floatNum = scanner.nextFloat();
System.out.println("輸入的字符型:" + floatNum);
double doubleNum = scanner.nextDouble();
System.out.println("輸入的字符型:" + doubleNum);
}
}

要實(shí)現(xiàn)從控制臺(tái)輸入并讀取到我們的程序中時(shí),需要借助 Scanner 類,它屬于標(biāo)準(zhǔn)輸入流,其步驟總結(jié)如下:
首先,需要導(dǎo)入 Scanner類。即import java.util.Scanner,其中import表示導(dǎo)入某個(gè)類,并且只能放在程序的開頭。然后創(chuàng)建 Scanner對(duì)象。這里需要注意,創(chuàng)建時(shí)需要傳入System.in,表示標(biāo)準(zhǔn)輸入流,與之對(duì)應(yīng)的System.out則代表標(biāo)準(zhǔn)輸出流。最后就是讀取用戶輸入即可。這里讀取時(shí),調(diào)用不同的方法 Scanner會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,不用我們?nèi)ミM(jìn)行手動(dòng)轉(zhuǎn)換。
從控制臺(tái)獲取不同類型的輸入,其常用方法如下:
| 返回值 | 方法名 | 描述 |
|---|---|---|
boolean | hasNext() | 如果還有輸入,則返回 true,否則返回 false |
String | next() | 返回輸入的字符串,以空格為分隔符 |
String | nextLine() | 返回輸入的字符串,以換行為分隔符 |
int | nextInt() | 輸入整型數(shù) |
long | nextLong() | 輸入長(zhǎng)整型數(shù) |
float | nextFloat() | 輸入單精度數(shù) |
double | nextDouble | 輸入雙精度數(shù) |
這里值得注意的是 next() 和 nextLine 兩個(gè)方法,雖然他們的作用都是用于獲取輸入的 String 類型的內(nèi)容,但是它們具體的處理機(jī)制又會(huì)有所區(qū)別。針對(duì) next() 而言,它會(huì)自動(dòng)消除有效字符前的空格,從而只返回輸入的字符,得到的字符串都不會(huì)帶有空格。也就是說(shuō),當(dāng)使用 next() 時(shí),如果遇到空格,此時(shí)就會(huì)停止錄入,只錄入空格前的內(nèi)容,而空格后的內(nèi)容則會(huì)保留到緩沖區(qū)。除了空格之外,next() 也會(huì)對(duì)制表符和換行符采用同樣的處理方式。而對(duì) nextLine() 來(lái)說(shuō),它會(huì)返回?fù)Q行符之前的所有內(nèi)容,甚至是帶空格的字符串。
因此,在使用時(shí)一定要注意它們之間的區(qū)別,合理搭配使用,從而得到自己想要的結(jié)果。
輸出
其實(shí)從一開始的 hello world 到目前的代碼中,我們已經(jīng)接觸過(guò)輸出了,也就是我們的 System.out.println()。
其中 println 表示輸出并換行,如果我們不想換行,則使用 print 就可以了。
通過(guò)上述方式所輸出的內(nèi)容都是擠在一起的,十分不方便我們閱讀。為了更加清晰的打印出我們所需要的結(jié)果,可以使用格式化輸出。
要使用格式化輸出,需要使用 System.out.printf() 或者 System.out.format() 搭配占位符,然后在后面的參數(shù)格式化成指定格式即可,兩者達(dá)成的效果是等價(jià)的。常見的占位符如下:
| 占位符 | 描述 |
|---|---|
%d | 格式化輸出整數(shù) |
%f | 格式化輸出浮點(diǎn)數(shù) |
%s | 格式化輸出字符串 |
%x | 格式化輸出十六進(jìn)制整數(shù) |
%e | 格式化輸出科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù) |
此外,我們還可以使用各種轉(zhuǎn)義字符來(lái)使得我們的輸出更為簡(jiǎn)潔,常見的轉(zhuǎn)義字符及意義如下表所示。
| 轉(zhuǎn)義字符 | 描述 |
|---|---|
\n | 換行 |
\t | 水平制表符 |
\\ | 表示一個(gè)反斜杠 |
\' | 表示一個(gè)單引號(hào) |
\" | 表示一個(gè)雙引號(hào) |
/**
* @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("公眾號(hào):" + name);
System.out.print("公眾號(hào):" + 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)如上圖所示,它可以說(shuō)是最簡(jiǎn)單的,只需要按照解決問(wèn)題的順序?qū)懗鰧?duì)應(yīng)的語(yǔ)句即可,其執(zhí)行順序是自上而下,依次執(zhí)行的。就類似于我們求解一道數(shù)學(xué)題,你得根據(jù)題意一步一步來(lái),直至解出最后的答案。
分支結(jié)構(gòu)
上圖是分支結(jié)構(gòu),順序結(jié)構(gòu)雖然能夠處理計(jì)算、輸出等問(wèn)題,當(dāng)遇到需要判斷選擇時(shí),順序結(jié)構(gòu)已經(jīng)不能很好的解決了,此時(shí)就需要使用分支結(jié)構(gòu)。Java 中,分支結(jié)構(gòu)相關(guān)的語(yǔ)句主要涉及到 if 和 switch 相關(guān),下面就分別來(lái)看一下。
if
單次判斷
當(dāng)我們只進(jìn)行一次判斷時(shí),可以使用一個(gè) if 語(yǔ)句包含一個(gè)條件表達(dá)式,其語(yǔ)法格式如下;
if(條件表達(dá)式){
執(zhí)行語(yǔ)句;
}
其執(zhí)行邏輯如下圖所示,如果條件表達(dá)式的值為 true,則執(zhí)行 if 語(yǔ)句塊中的執(zhí)行語(yǔ)句,否則就執(zhí)行 if 語(yǔ)句塊后邊的代碼;

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

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

從上面的實(shí)例,利用 while 循環(huán),我們就能輕易達(dá)成循環(huán)的效果。其語(yǔ)法格式如下:
while(表達(dá)式){
執(zhí)行語(yǔ)句;
}
只要表達(dá)式為 true,就會(huì)不斷循環(huán)執(zhí)行其中的執(zhí)行語(yǔ)句,直到表達(dá)式為 false,此時(shí)便跳出循環(huán),不再執(zhí)行其中的執(zhí)行語(yǔ)句。
除開上面的形式之外,還有另一種 while 形式:
do{
執(zhí)行語(yǔ)句;
}while(表達(dá)式);
兩者的最大區(qū)別在于:do……while 無(wú)論 表達(dá)式 是否為 true,都至少會(huì)執(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);
}
}

觀察以上兩個(gè)實(shí)例,在 while 程序中,我們定義 num = 10,然后假設(shè) num <= 9 時(shí)就進(jìn)入循環(huán)體,而 ,所以不進(jìn)入循環(huán)體,直接打印 sum 的值為 0。而在 do…while 程序中,我們同樣定義 num = 10,然后假設(shè) num < 10 時(shí)繼續(xù)循環(huán),很明顯不滿足該情況,理應(yīng)跳出循環(huán),打印出 sum 的值為 10,說(shuō)明此時(shí)還是進(jìn)行了一次循環(huán)。
因此,當(dāng)我們需要在 while 和 do……while 之間做出選擇時(shí),如果我們最少需要進(jìn)行一次循環(huán),則選擇 do……while,其他情況下選用兩者都可以。
for
普通 for 循環(huán)
除開 while 和 do……while 之外,我們還有 for 循環(huán)來(lái)達(dá)成同樣的結(jié)果,只是表達(dá)方法不一樣。同樣以上面計(jì)算 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)的語(yǔ)法形式如下:
for(初始條件;終止條件;更新語(yǔ)句){
循環(huán)語(yǔ)句;
}
for 循環(huán)的執(zhí)行步驟如下:
首先執(zhí)行初始條件,可以聲明一種類型,但可以初始化一個(gè)或多個(gè)循環(huán)控制變量,甚至可以放空; 接著判斷終止條件,如果為 true,則進(jìn)入循環(huán)體執(zhí)行循環(huán)語(yǔ)句;如果為false,則終止循環(huán),執(zhí)行循環(huán)體后面的語(yǔ)句;一次循環(huán)完成后,執(zhí)行更新語(yǔ)句來(lái)更新循環(huán)控制變量; 最后再次判斷終止條件,循環(huán)以上三個(gè)步驟;
for 和 while 最大的區(qū)別就在于 for 循環(huán)一般都是事先知道需要循環(huán)的次數(shù)的,而 while 循環(huán)則不需要。
增強(qiáng) for 循環(huán)
自 Java 5 后,引入了一種增強(qiáng)型 for 循環(huán),主要用于數(shù)字遍歷,其語(yǔ)法格式如下:
for(聲明語(yǔ)句:表達(dá)式){
// 循環(huán)語(yǔ)句
}
/**
* @author : cunyu
* @version : 1.0
* @className : Main
* @date : 2021/4/16 10:39
* @description : 增強(qiáng) 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");
}
}
}

其中,聲明語(yǔ)句一般是聲明一個(gè)同數(shù)組數(shù)據(jù)類型相同的局部變量,而表達(dá)式則是要訪問(wèn)的數(shù)組名或者返回值是數(shù)組的方法。
continue & break
break
主要用在循環(huán)語(yǔ)句或者 switch 語(yǔ)句中,表示跳出最里層的循環(huán),然后繼續(xù)執(zhí)行該循環(huán)下的語(yǔ)句。
break 在 switch 語(yǔ)句中的用法已經(jīng)見識(shí)過(guò)了,我們就來(lái)看看它在循環(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 時(shí),我們執(zhí)行了 break 語(yǔ)句,此時(shí)就直接跳出了 for 循環(huán),而不再進(jìn)行下一次的循環(huán)。
continue
continue 也同樣是應(yīng)用在循環(huán)控制結(jié)構(gòu)中,主要是讓程序跳出當(dāng)次循環(huán),進(jìn)而進(jìn)入下一次循環(huán)的迭代。
在 for 循環(huán)中,執(zhí)行 continue 語(yǔ)句后,直接跳轉(zhuǎn)到更新語(yǔ)句,而不再執(zhí)行 continue 后的語(yǔ)句。而在 while 或 do……while 循環(huán)中,執(zhí)行 continue 語(yǔ)句后,直接跳轉(zhuǎn)到表達(dá)式的判斷。
/**
* @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 時(shí),我們執(zhí)行了 continue 語(yǔ)句,此時(shí)便跳出了當(dāng)次循環(huán),不再進(jìn)行后邊的打印語(yǔ)句,然后繼續(xù)下一次的循環(huán),所以最終打印的結(jié)果沒(méi)有 5.
總結(jié)
今天的內(nèi)容到此就結(jié)束了,老規(guī)矩,如果大家覺得有用的話,就給個(gè)點(diǎn)贊關(guān)注吧!
其次就是對(duì)于文中遺漏或者存在欠缺的知識(shí)點(diǎn),還請(qǐng)大家不吝賜教,在評(píng)論區(qū)指出來(lái)!
- END -