Java流程控制語句最全匯總(上篇)
前文
本章是關(guān)于Java流程控制語句的最全匯總,本篇為匯總上篇。
流程是人們生活中不可或缺的一部分,它表示人們每天都在按照一定的流程做事。
比如出門搭車、上班、下班、搭車回家。這其中的步驟是有順序的。
程序設(shè)計(jì)也需要有流程控制語句來完成用戶的要求,根據(jù)用戶的輸入決定程序要進(jìn)入什么流程,即“做什么”以及“怎么做”等。
從結(jié)構(gòu)化程序設(shè)計(jì)角度出發(fā),程序有 3 種結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
若是在程序中沒有給出特別的執(zhí)行目標(biāo),系統(tǒng)則默認(rèn)自上而下一行一行地執(zhí)行該程序,這類程序的結(jié)構(gòu)就稱為順序結(jié)構(gòu)。
到目前為止,我們所編寫的程序都屬于順序結(jié)構(gòu)。
但是事物的發(fā)展往往不會(huì)遵循早就設(shè)想好的軌跡進(jìn)行,因此,所設(shè)計(jì)的程序還需要能夠具有在不同的條件下處理不同問題以及當(dāng)需要進(jìn)行一些相同的重復(fù)操作時(shí),如何能省時(shí)省力地解決問題的能力。
在本章中,我們將對(duì) Java 程序中的上述3種流程結(jié)構(gòu)進(jìn)行學(xué)習(xí)。
初學(xué)者應(yīng)該對(duì)本章的每個(gè)小節(jié)進(jìn)行仔細(xì)閱讀、思考,這樣才能達(dá)到事半功倍的效果。
Java語句:Java空語句、復(fù)合語句和表達(dá)式語句
按照語句的組成部分,可以將順序結(jié)構(gòu)中的語句分為表達(dá)式語句、空語句和復(fù)合語句 3 大類。
下面首先介紹 Java 中語句的編寫方式,然后對(duì)這 3 類語句進(jìn)行詳細(xì)介紹。
語句編寫方式
在 Java 中,語句是最小的組成單位,每個(gè)語句必須使用分號(hào)作為結(jié)束符。
除此之外,Java 對(duì)語句無任何其他限制,開發(fā)人員可以很隨意地用符合自己風(fēng)格的方式編寫語句。
例如,可以將一個(gè)語句放在多行中,示例如下:
String str = "Apple " +"Banner "+"Pear " +" Orange";
由于 Java 使用分號(hào)作為語句的結(jié)束符,所以上面的 3 行代碼會(huì)被 Java 認(rèn)為是一條語句,因?yàn)檫@ 3 行中只有一個(gè)分號(hào)。
但是,我們不推薦使用這種方式來編寫語句。
同樣,因?yàn)槭褂梅痔?hào)作為分隔符,將多個(gè)語句放在一行來編寫也是允許的。
例如,下面的示例代碼也是正確的。
int a=0,b,c;b=a+10;b++;c=a*b;System.out.println(c);
上面將 5 個(gè)語句放在一行中。
為了使程序語句排列得更加美觀、容易閱讀和排除錯(cuò)誤,一般使用如下規(guī)則格式化源代碼。
在一行內(nèi)只寫一個(gè)語句,并采用空格、空行來保證語句容易閱讀。
在每個(gè)復(fù)合語句內(nèi)使用 Tab 鍵向右縮進(jìn)。大括號(hào)總是放在單獨(dú)的一行,便于檢查是否匹配。
空語句
所謂空語句(Empty Statement),它在程序中什么都不做,也不包含具有實(shí)際性的語句。
在程序中,空語句主要用來作為空循環(huán)體。
空語句的語法格式如下:
; // 其實(shí)就是一個(gè)分號(hào)
執(zhí)行一個(gè)空語句就是將控制轉(zhuǎn)到該語句的結(jié)束點(diǎn)。
這樣,如果空語句是可到達(dá)的,則空語句的結(jié)束點(diǎn)也是可到達(dá)的。
表達(dá)式語句
在很多的高級(jí)語言中,有專門的賦值語句。
而在 Java 中將賦值作為一個(gè)運(yùn)算符,因此只有賦值表達(dá)式。
在賦值表達(dá)式后面添加分號(hào)就成了獨(dú)立的語句。
以下是一些表達(dá)式的示例語句:
3.1415926; (a+b)/2; x*y*z-y+(20-x);
這些表達(dá)式能夠被 Java 編譯器識(shí)別,但是由于沒有對(duì)程序進(jìn)行任何操作,因此無任何意義。
一般表達(dá)式語句應(yīng)該能完成一個(gè)操作,如修改變量的值或者作為函數(shù)參數(shù)等。
具體方法是,在表達(dá)式的左側(cè)指定一個(gè)變量來存儲(chǔ)表達(dá)式的值,或者將表達(dá)式傳遞給函數(shù)。
以下是修改后的表達(dá)式語句:
pi = 3.1415926; output(pi); // 將pi的值傳遞到output()函數(shù)中作為參數(shù) sum = (a+b)/2; printf("%f",sum); // 將sum的值傳遞到printf()函數(shù)輸出 temp = x*y*z-y+(20-x); // 將表達(dá)式的值保存到temp變量中
復(fù)合語句
復(fù)合語句又稱為語句塊,是很多個(gè)語句的組合,從而可以將多個(gè)語句看作單個(gè)語句。
復(fù)合語句的語法格式如下:
{ statement-list // 語句列表}
可以看到由一個(gè)擴(kuò)在大括號(hào)內(nèi)的可選 statement-list 組成。
statement-list 是由一個(gè)或者多個(gè)語句組成的列表,如果不存在 statement-list,則稱該語句塊是空的。
它的執(zhí)行規(guī)則如下:
- 如果語句塊是空的,控制轉(zhuǎn)到語句塊的結(jié)束點(diǎn)。
- 如果語句塊不是空的,控制轉(zhuǎn)到語句列表。當(dāng)控制到達(dá)語句列表的結(jié)束點(diǎn)時(shí),控制轉(zhuǎn)到語句的結(jié)束點(diǎn)。
例 1
創(chuàng)建一個(gè)語句塊,該語句塊包含 3 條語句。
{ width = 10; // 為width變量賦值 height = 90; // 為height變量賦值 area = width * height; // 計(jì)算width變量和height變量的乘積 }
上述代碼執(zhí)行后,sum 變量的值為 900。
上述的語句塊中大括號(hào)內(nèi)包含了 3 條語句。
第一條語句為 width 變量賦值,第二條語句為 height 變量賦值,第三條語句則將 width 和 height 相乘,結(jié)果保存在 sum 變量中。
Java if else分支結(jié)構(gòu)精講
Java 支持兩種選擇語句:if 語句和 switch 語句。
其中 if 語句使用布爾表達(dá)式或布爾值作為分支條件來進(jìn)行分支控制,而 switch 語句則用于對(duì)多個(gè)整型值進(jìn)行匹配,從而實(shí)現(xiàn)分支控制。
這些語句允許你只有在程序運(yùn)行時(shí)才能知道其狀態(tài)的情況下,控制程序的執(zhí)行過程。
如果你沒有 C/C++ 的編程背景,你將會(huì)為這兩個(gè)語句的強(qiáng)大功能和靈活性而感到吃驚。
選擇結(jié)構(gòu)(也叫分支結(jié)構(gòu))解決了順序結(jié)構(gòu)不能判斷的缺點(diǎn),可以根據(jù)一個(gè)條件判斷執(zhí)行哪些語句塊。
選擇結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算。
例如,判斷是否到下班時(shí)間,判斷兩個(gè)數(shù)的大小等。
if 結(jié)構(gòu)
if 語句是使用最多的條件分支結(jié)構(gòu),它屬于選擇語句,也可以稱為條件語句。
if 選擇結(jié)構(gòu)是根據(jù)條件判斷之后再做處理的一種語法結(jié)構(gòu)。
默認(rèn)情況下,if 語句控制著下方緊跟的一條語句的執(zhí)行。不過,通過語句塊,if 語句可以控制多個(gè)語句。
if 語句的最簡(jiǎn)語法格式如下,表示“如果滿足某種條件,就進(jìn)行某種處理”。
if (條件表達(dá)式) { 語句塊;}
其中“條件表達(dá)式”和“語句塊”是比較重要的兩個(gè)地方。
- 條件表達(dá)式:條件表達(dá)式可以是任意一種邏輯表達(dá)式,最后返回的結(jié)果必須是一個(gè)布爾值。取值可以是一個(gè)單純的布爾變量或常量,也可以是使用關(guān)系或布爾運(yùn)算符的表達(dá)式。如果條件為真,那么執(zhí)行語句塊;如果條件為假,則語句塊將被繞過而不被執(zhí)行。
- 語句塊:該語句塊可以是一條語句也可以是多條語句。如果僅有一條語句,可省略條件語句中的大括號(hào) {}。當(dāng)從編程規(guī)范角度不要省略大括號(hào),省略大括號(hào)會(huì)使程序的可讀性變差。
if 條件語句的運(yùn)行流程如圖 1 所示。
圖1 if 語句執(zhí)行流程圖
例 1
編寫一個(gè) Java 程序,允許用戶從鍵盤輸入一個(gè)數(shù)字,再判斷該數(shù)是否大于 100。使用 if 語句的實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { System.out.println("請(qǐng)輸入一個(gè)數(shù)字:"); Scanner input = new Scanner(System.in); int num = input.nextInt(); // 接收鍵盤輸入數(shù)據(jù) // 判斷用戶輸入的數(shù)據(jù)是否大于100 if (num > 100) { System.out.println("輸入的數(shù)字大于100"); } // 判斷用戶輸入的數(shù)據(jù)是否等于100 if (num == 100) { System.out.println("輸入的數(shù)字等于100"); } // 判斷用戶輸入的數(shù)據(jù)是否小于100 if (num < 100) { System.out.println("輸入的數(shù)字小于100"); } }
運(yùn)行該程序,分別使用鍵盤輸入 99、100 和 105,結(jié)果如下所示:
請(qǐng)輸入一個(gè)數(shù)字:
99
輸入的數(shù)字小于100
請(qǐng)輸入一個(gè)數(shù)字:
100
輸入的數(shù)字等于100
請(qǐng)輸入一個(gè)數(shù)字:
105
輸入的數(shù)字大于100
例 2
假設(shè)有 num1 和 num2 兩個(gè)變量,它們的值分別是 50 和 34。
下面編寫程序,要求使用 if 語句判斷 num1 和 num2 的大小關(guān)系,并輸出比較結(jié)果。
實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { int num1 = 50; int num2 = 34; if (num1 > num2) { System.out.println("num1大于num2"); } if (num1 == num2) { System.out.println("num2等于num2"); } if (num1 < num2) { System.out.println("num1小于num2"); } }
該段選擇語句判斷了 num1 值和 num2 值的大于、等于和小于關(guān)系。此處 num1 為 50,num2 為 34,所以執(zhí)行后會(huì)輸出“num1 大于 num2”。
例 3
在上述兩個(gè)案例代碼中,由于每個(gè) if 語句的語句塊中只包含一條語句,所以省略了大括號(hào)。
本實(shí)例在登錄系統(tǒng)中要求用戶名、密碼和驗(yàn)證碼都必須正確,否則將顯示登錄失敗及錯(cuò)誤提示。
其中的語句塊有多條語句,所以需要使用大括號(hào)。代碼如下:
public static void main(String[] args) { String username = "admin"; // 用戶名 String userpass = "123456"; // 密碼 String code = "0000"; // 驗(yàn)證碼 if (username != "admin" && userpass != "123456" && code != "0000") { System.out.println("登錄失??!"); System.out.println("請(qǐng)檢查輸入的用戶名、密碼和驗(yàn)證碼是否正確!"); } }
在這里為 if 語句設(shè)置了一個(gè)復(fù)雜的復(fù)合表達(dá)式來驗(yàn)證登錄條件。執(zhí)行后的輸出結(jié)果如下:
登錄失敗!
請(qǐng)檢查輸入的用戶名、密碼和驗(yàn)證碼是否正確!
if-else 結(jié)構(gòu)
單 if 語句僅能在滿足條件時(shí)使用,而無法執(zhí)行任何其他操作(停止)。
而結(jié)合 else 語句的 if 可以定義兩個(gè)操作,此時(shí)的 if…else 語句表示“如果條件正確則執(zhí)行一個(gè)操作,否則執(zhí)行另一個(gè)操作”。
使用 if…else 語句的語法格式如下所示:
if (表達(dá)式) { 語句塊1; } else { 語句塊2; }
在上述語法格式中,如果 if 關(guān)鍵字后面的表達(dá)式成立,那么就執(zhí)行語句塊 1,否則的話則執(zhí)行語句塊 2,其運(yùn)行流程如圖 2 所示。
圖2 if…else 運(yùn)行流程
例 4
在例 3 中為實(shí)現(xiàn)比較 num1 和 num2 的大小,使用了 3 個(gè) if 條件語句分別判斷大于、等于和小于的情況。
下面使用 if…else 雙條件來實(shí)現(xiàn),具體代碼如下:
public static void main(String[] args) { int num1 = 50; int num2 = 34; // 如果num1等于num2 if (num1 == num2) { System.out.println("num1等于num2"); } // 如果num1大于num2 if (num1 > num2) { System.out.println("num1大于num2"); } else { // 否則就是num1小于num2 System.out.println("num1小于num2"); } }
雙條件語句減少了代碼的編寫量,同時(shí)增強(qiáng)了程序的可讀性。
簡(jiǎn)化后的結(jié)果還是一樣,執(zhí)行后會(huì)輸出“num1 大于 num2”。
多條件 if-else-if 語句
if 語句的主要功能是給程序提供一個(gè)分支。
然而,有時(shí)候程序中僅僅多一個(gè)分支是遠(yuǎn)遠(yuǎn)不夠的,甚至有時(shí)候程序的分支會(huì)很復(fù)雜,這就需要使用多分支的 if…else if 語句。
通常表現(xiàn)為“如果滿足某種條件,就進(jìn)行某種處理,否則如果滿足另一種條件才執(zhí)行另一種處理……,這些條件都不滿足則執(zhí)行最后一種條件”。
if…else if 多分支語句的語法格式如下所示:
if(表達(dá)式1) { 語句塊1; } else if(表達(dá)式2) { 語句塊2; ... } else if(表達(dá)式n) { 語句塊n; } else { 語句塊n+1; }
可以看出,else-if 結(jié)構(gòu)實(shí)際上是 if-else 結(jié)構(gòu)的多層嵌套。
明顯的特點(diǎn)就是在多個(gè)分支中只執(zhí)行一個(gè)語句組,而其他分支都不執(zhí)行,所以這種結(jié)構(gòu)可以用于有多種判斷結(jié)果的分支中。
在使用 if…else if 語句時(shí),依次判斷表達(dá)式的值,當(dāng)某個(gè)分支的條件表達(dá)式的值為 true 時(shí),則執(zhí)行該分支對(duì)應(yīng)的語句塊,然后跳到整個(gè) if 語句之外繼續(xù)執(zhí)行程序。
如果所有的表達(dá)式均為 false,則執(zhí)行語句塊 n+1,然后繼續(xù)執(zhí)行后續(xù)程序,其運(yùn)行流程如圖 3 所示。
圖3 if…else if 語句的執(zhí)行流程
例 5
同樣以比較 num1 和 num2 的大小為例,使用 if…else if 多條件的實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { int num1 = 50; int num2 = 34; if (num1 == num2) { // 如果num1等于num2 System.out.println("num1等于num2"); } else if (num1 > num2) { // 如果num1大于num2 System.out.println("num1大于num2"); } else { // 否則就是小于 System.out.println("num1小于num2"); } }
如上述代碼所示,num1 和 num2 不滿足 if 語句的“num1==num2”條件,接著測(cè)試 else if 的“num1>num2”條件,滿足該條件并輸出“num1 大于 num2”。
例 6
假設(shè)某學(xué)校對(duì)成績(jī)的判斷標(biāo)準(zhǔn)是:不低于 90,可以評(píng)為優(yōu)秀;低于 90 但不低于 80,可以評(píng)為良好;低于 80 但不低于 60,可以評(píng)為中等;否則評(píng)為差。
public static void main(String[] args) { System.out.println("請(qǐng)輸入考試成績(jī):"); Scanner input = new Scanner(System.in); int score = input.nextInt(); // 接收鍵盤輸入數(shù)據(jù) if (score >= 90) { // 考試成績(jī)>=90 System.out.println("優(yōu)秀"); } else if (score >= 80) { // 90>考試成績(jī)>=80 System.out.println("良好"); } else if (score >= 60) { // 80>考試成績(jī)>=60 System.out.println("中等"); } else { // 考試成績(jī)<60 System.out.println("差"); } }
當(dāng)考試成績(jī)?yōu)?90 分以上時(shí),則執(zhí)行第一個(gè) if 語句,下面的 3 個(gè)條件判斷語句不會(huì)執(zhí)行;當(dāng)考試成績(jī)?yōu)?80 分以上 90 分以下時(shí),則執(zhí)行第一個(gè) else if 語句;當(dāng)考試成績(jī)?cè)?60~80 分,并且包含 60 分的成績(jī),則執(zhí)行第二個(gè) else if 語句;如果上述 3 個(gè)條件都不滿足,則執(zhí)行 else 語句。
程序運(yùn)行后的輸出效果如下所示:
請(qǐng)輸入考試成績(jī):
100
優(yōu)秀
請(qǐng)輸入考試成績(jī):
88
良好
請(qǐng)輸入考試成績(jī):
50
差
嵌套 if 的使用
if 語句的用法非常靈活,不僅可以單獨(dú)使用,還可以在 if 語句里嵌套另一個(gè) if 語句。
同樣,if…else 語句和 if…else if 語句中也可以嵌套另一個(gè) if 結(jié)構(gòu)的語句,以完成更深層次的判斷。
嵌套 if 的語法格式如下:
if(表達(dá)式1) { if(表達(dá)式2) { 語句塊1; } else { 語句塊2; } } else { if(表達(dá)式3) { 語句塊3; } else if(表達(dá)式4) { 語句塊4; } else { if(表達(dá)式n) { 語句塊n; } else { 語句塊n+1; } } }
在上述格式中,應(yīng)該注意每一條 else 與離它最近且沒有其他 else 對(duì)應(yīng)的 if 相搭配,其執(zhí)行流程如圖 4 所示。
圖4 嵌套 if 語句執(zhí)行流程
例 7
活動(dòng)計(jì)劃安排,如果今天是工作日,去上班;如果今天是周末,則出去游玩;同時(shí),如果周末天氣晴朗,去室外游樂場(chǎng)游玩,否則去室內(nèi)游樂場(chǎng)游玩。實(shí)現(xiàn)代碼如下:
public static void main(String[] args) { String today = "周末"; String weather = "晴朗"; if (today.equals("周末")) { if (weather.equals("晴朗")) { System.out.println("去室外游樂場(chǎng)游玩"); } else { System.out.println("去室內(nèi)游樂場(chǎng)游玩"); } } else { System.out.println("去上班"); } }
如上述代碼所示,today 滿足 if 語句的“today.equals(“周末”)”條件,接著測(cè)試 weather 是否滿足“weather.equals(“晴朗”)”條件,滿足該條件輸出“去室外游樂場(chǎng)游玩”。
到此這篇關(guān)于Java流程控制語句最全匯總(上篇)的文章就介紹到這了,其他兩個(gè)部分的內(nèi)容(中、下篇)請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot遇到的坑@Qualifier報(bào)紅的解決
這篇文章主要介紹了SpringBoot遇到的坑@Qualifier報(bào)紅的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java中如何取出String字符串括號(hào)中的內(nèi)容
這篇文章主要介紹了Java中如何取出String字符串括號(hào)中的內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Java OOM 異常場(chǎng)景與排查過程(堆、棧、方法區(qū))
這篇文章主要介紹了Java OOM 異常場(chǎng)景與排查過程(堆、棧、方法區(qū)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)的相關(guān)資料,需要的朋友可以參考下2020-02-02Springboot集成Proguard生成混淆jar包方式
本文介紹了兩種Java代碼混淆工具:ClassFinal和ProGuard,ClassFinal是一個(gè)字節(jié)碼加密工具,但需要額外的加密包,使用復(fù)雜,ProGuard是一款開源的Java代碼混淆工具,可以有效地提高代碼的安全性,但對(duì)Spring框架的注解處理不夠完善2024-11-11使用Java?Socket實(shí)現(xiàn)GPS定位數(shù)據(jù)處理
在許多應(yīng)用場(chǎng)景中,如車輛追蹤、移動(dòng)設(shè)備定位等,GPS定位數(shù)據(jù)的實(shí)時(shí)獲取和處理至關(guān)重要,本文將介紹如何使用Java?Socket編程來接收GPS設(shè)備發(fā)送的數(shù)據(jù)并進(jìn)行處理,需要的朋友可以參考下2024-07-07Java使用Collections.sort()排序的示例詳解
這篇文章主要介紹了Java使用Collections.sort()排序的示例詳解,Collections.sort(list, new PriceComparator());的第二個(gè)參數(shù)返回一個(gè)int型的值,就相當(dāng)于一個(gè)標(biāo)志,告訴sort方法按什么順序來對(duì)list進(jìn)行排序。對(duì)此感興趣的可以了解一下2020-07-07