![Java 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/583/24172583/b_24172583.jpg)
第3章 程序的运行轨迹——Java语言的流程控制
◎ 本章教学微视频:14个 52分钟
学习指引
在Java中,程序之所以能够按照人们的意愿执行,主要是依靠程序的控制结构。无论多么复杂的程序,都是由这些基本的语句组成的。本章介绍Java语言的流程控制,主要内容为流程控制的3种方式——程序的顺序结构、分支结构和循环结构。
重点导读
- 熟悉Java程序运行的流程控制方式。
- 掌握Java程序运行的顺序结构。
- 掌握Java程序运行的分支结构。
- 掌握Java程序运行的循环结构。
- 掌握Java程序运行的跳转语句。
3.1 流程控制
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P73_11212.jpg?sign=1738849688-dzMjkSgn4mWQMr7uT2VRM3BFSspo5Ycy-0-bd0424f0e4e31892da1dfe54e25b5a2c)
Java程序的流程控制包括顺序控制、条件控制和循环控制。顺序控制是从头到尾依次执行每条语句操作。条件控制是基于条件选择执行语句,如果条件成立,则执行操作A,反之则执行操作B。循环控制又称为回路控制,是根据循环初始条件和终结要求执行循环体内的操作。
具体地讲,程序流程控制语句分为3类:分支语句,包括if语句和switch语句;循环语句,包括for语句、while语句和do…while语句;跳转语句,包括break语句、continue语句和return语句。
3.2 顺序结构
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P73_11213.jpg?sign=1738849688-zscwTiTEV0ceEuST529DxE9mJecKC18g-0-b140291bf1c531d05e6705deb759f1bb)
顺序结构是最简单、最常用的程序结构,只要按照解决问题的步骤写出相应的语句就行,它的执行顺序是自上而下依次执行。有一些程序并不按顺序执行语句,这个过程称为控制的转移,它涉及了另外两类程序的控制结构,即分支结构和循环结构。
3.3 分支结构
在实际的程序设计中,根据输入数据和中间结果的不同情况需要选择不同的语句执行,在这种情况下,必须根据某个变量或表达式的值做出判断,以决定执行哪些语句和跳过哪些语句不执行。Java有两种分支结构,分别是if语句和switch语句。
3.3.1 if语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P74_11339.jpg?sign=1738849688-IqEJ2EcUF0RJvMzkOIZ2ey3cmNYBU4B5-0-4a14626583c44e3818691e5152b26362)
一个if语句包含一个布尔表达式和一条或多条语句。其语法格式如下:
if(布尔表达式) { 语句//如果布尔表达式为true将执行的语句 }
如果布尔表达式的值为true,则执行if语句大括号中的语句,否则执行if语句后面的代码。if语句流程图如图3-1所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P74_92025.jpg?sign=1738849688-P6y6p1rrOvndrXojgbe9q3BkUE9SsDgz-0-e2218f538ab9f5431e02a44444b631ec)
图3-1 if语句流程图
【例3-1】(实例文件:ch03\Chap3.1.txt)if语句应用实例。
public class Test { public static void main(String[] args) { int x = 10; if (x < 20) { System.out.print("这是 if 语句"); } } }
程序运行结果如图3-2所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P74_11329.jpg?sign=1738849688-5yXrLk0OOGOEcLm6rjlkDLmLFtAcwLuY-0-08a055f7c1e9f83ae714207cb824716e)
图3-2 if语句应用实例
3.3.2 if…else语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P75_11502.jpg?sign=1738849688-CABewpJdbzqy0BgJsEpCvbU5kF5laSLT-0-2c2914f7ad638b6754f107dbc251feab)
if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句会被执行。语法格式如下:
if(布尔表达式){ 语句1 //如果布尔表达式的值为true将执行的语句 }else{ 语句2 //如果布尔表达式的值为false将执行的语句 }
if…else表示判断两种情况:要么满足if的条件;要么不满足if的条件,此时执行else语句。if…else语句流程图如图3-3所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P75_92027.jpg?sign=1738849688-F3d3V2BeyXshiIbuLOCGxgRyz65GfBsw-0-1eb9b32b6549f8b13f4eef4ea1ba3d52)
图3-3 if…else语句流程图
【例3-2】(实例文件:ch03\Chap3.2.txt)if…else语句应用实例。
public class Test { public static void main(String[] args) { int x = 30; if (x < 20) { System.out.print("这是 if 语句"); } else { System.out.print("这是 else 语句"); } } }
程序运行结果如图3-4所示。本例中若x小于20,则显示“这是if语句”;其他情况则显示“这是else语句”。x和20进行比较有3种情况,大于、小于和等于,此时的else应该包括了大于和等于两种情况,即x只要是大于或等于20就会执行else语句内的代码。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P75_11493.jpg?sign=1738849688-1TcA0hmuBW3l5exHPg7hpLcMqmap29TC-0-2eacd44c8c6a4d5e59b238f3bf75f2d2)
图3-4 if…else语句应用实例
3.3.3 if…else if…else语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P76_11739.jpg?sign=1738849688-cov7VauN43eYVvwtuoGul8cFDppjtU3E-0-41a61d043df5a026891bf97a693b03da)
if语句后面可以跟else if…else语句,这种语句可以检测多种可能的情况,也被称为多条件判断语句或多分支语句。if多条件判断语句流程图如图3-5所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P76_92029.jpg?sign=1738849688-ASbUErHoiHDj5GhmCMTrtAFptAT5RsPD-0-b3819eac139390a145f6e419a9f7afcd)
图3-5 if多条件判断语句流程图
使用if…else if…else语句的时候,需要注意下面几点:
- if语句至多有—个else语句,else语句在所有的else if语句之后。
- if语句可以有若干else if语句,它们必须在else语句之前。
- 一旦其中一个else if语句检测为true,其他的else if以及else语句都将被跳过。
if…else if…else语句应用的语法格式如下:
if(布尔表达式 1){ 语句1//如果布尔表达式 1的值为true执行的代码 }else if(布尔表达式 2){ 语句2//如果布尔表达式 2的值为true执行的代码 }else if(布尔表达式 3){ 语句3//如果布尔表达式 3的值为true执行的代码 }else { 语句4//如果以上布尔表达式都不为true执行的代码 }
【例3-3】(实例文件:ch03\Chap3.3.txt)多条件判断语句应用实例。
public class Test { public static void main(String[] args) { int x = 30; if (x == 10) { System.out.print("Value of X is 10"); } else if (x == 20) { System.out.print("Value of X is 20"); } else if (x == 30) { System.out.print("Value of X is 30"); } else { System.out.print("这是 else 语句"); } } }
程序运行结果如图3-6所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P77_11810.jpg?sign=1738849688-gDeuskyIuvCrkRZyd895eaWddSxOwLiJ-0-4baea68476667e57ae12c560401a5da0)
图3-6 多条件判断语句应用实例
提示:多条件判断语句就是利用多个条件进行判断,如果有一个条件满足,则执行,不满足则继续向后判断。
3.3.4 嵌套的if…else语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P77_11926.jpg?sign=1738849688-80z6VFuoFPIGOaGKkyJMxyjqLW5Oy8Q6-0-303cba472f458cab010bec46db7711b0)
使用嵌套的if…else语句是合法的,也就是说可以在一个if或者else if语句中使用if或者else if语句。语法格式如下:
if(布尔表达式 1){ 语句1//如果布尔表达式 1的值为true执行的代码 if(布尔表达式 2){ 语句2//如果布尔表达式 2的值为true执行的代码 } }
【例3-4】(实例文件:ch03\Chap3.4.txt)嵌套的if…else语句应用实例。
public class Test { public static void main(String args[]){ int x = 30; int y = 10; if( x == 30 ){ if( y == 10 ){ System.out.print("X = 30 and Y = 10"); } } } }
程序运行结果如图3-7所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P78_11929.jpg?sign=1738849688-8wsbB2hUQh97Hg1c4qqc4eFRVj6DIeO2-0-fb583bcd5e23f9b9ac6a75e555b1bdce)
图3-7 嵌套的if…else语句应用实例
3.3.5 switch语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P78_12086.jpg?sign=1738849688-7ppXgjNHMJV6y3Not7yrO961GCl4G5Iz-0-abc9c9a3f0ee12ea711eeb3a675d37dc)
switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。switch本身只能够支持int、char型,在JDK 1.5之后可以使用enum型,而在JDK 1.7之后可以使用String型。语法格式如下:
switch(expression){ case value : 语句 break; //可选 case value : 语句 break; //可选 //可以有任意数量的case语句 default : //可选 语句 }
switch语句有如下规则:
- switch语句中的变量类型可以是byte、short、int或者char。从Java SE 7开始,switch支持字符串类型。case标签必须为字符串常量或字面量。
- switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
- case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面量。
- 当变量的值与case语句的值相等时,case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
- 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不是必须包含break语句。如果没有break语句,程序会继续执行下一条case语句,直到遇到break语句。
- switch语句可以包含一个default分支,该分支必须是switch语句的最后一个分支。default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。
【例3-5】(实例文件:ch03\Chap3.5.txt)switch语句应用实例。
public class Test { public static void main(String[] args) { char grade = 'C'; switch (grade) { case 'A': System.out.println("优秀"); break; case 'B': case 'C': System.out.println("良好"); break; case 'D': System.out.println("及格"); case 'F': System.out.println("你需要再努力努力"); break; default: System.out.println("未知等级"); } System.out.println("你的等级是 " + grade); } }
程序运行结果如图3-8所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P79_12145.jpg?sign=1738849688-XZLhKpxnKU6pHvyKb3RLAC9hYuoiTK46-0-adb8c5ba9f3de08a4ad38260331866cd)
图3-8 switch语句应用实例
提示:使用switch语句的时候,如果满足条件的语句中没有break,那么就会在执行完满足条件的case语句后,继续判断下一个case语句的值是否满足条件,一直到switch语句结束或者是遇到break为止。
3.4 循环结构
顺序结构的程序语句只能被执行一次。如果想要使同样的操作执行多次,就需要使用循环结构。Java中有3种主要的循环结构,分别是while循环、do…while循环、for循环,另外,在Java 5中引入了一种主要用于数组的增强型for循环。
3.4.1 while语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P79_12222.jpg?sign=1738849688-OR40iD5X2G54ObknKDwTWUzopwpxKpbK-0-7e6831066424721a7584d7a92b5202cd)
while是最基本的循环,只要布尔表达式为true,循环体会一直执行下去。语法格式如下:
while( 布尔表达式 ) { 语句//循环内容 }
while语句流程图如图3-9所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P79_92043.jpg?sign=1738849688-Zn9xRU50cj5h6osPthVxprKEaeix68IE-0-f4efaf5f4633a4f4b4d34d90826bf394)
图3-9 while语句流程图
【例3-6】(实例文件:ch03\Chap3.6.txt)while语句应用实例。
public class Test { public static void main(String[] args) { int x = 10; while (x < 20) { System.out.print("value of x : " + x); x++; System.out.print("\n"); } } }
程序运行结果如图3-10所示。在本实例中,给定x初始值10,当满足x小于20这个条件时,会循环执行while语句,x每循环一次自加1,直到不满足条件为止。
注意:while语句一定要在循环内有让条件不成立的代码,否则就会陷入死循环。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P80_12287.jpg?sign=1738849688-6mMqTbHz3IWWKpAVEAoRpRCCmfXeINEd-0-3c56446898bebd2b4cd0a15774e65ad1)
图3-10 while语句应用实例
3.4.2 do…while语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P80_12364.jpg?sign=1738849688-bkaMrnL9Vtmm7cZ7X4Dj6tl2fYpi4xOu-0-312cfc1a62c33f8a3bd55bcb6c2e0fdf)
对于while语句而言,如果不满足条件,则不能进入循环。但有时候需要即使不满足条件也至少执行一次。do…while循环和while循环相似,不同的是,do…while循环至少会执行一次。语法格式如下:
do { 语句 }while(布尔表达式);
注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。如果布尔表达式的值为true,则语句块一直执行,直到布尔表达式的值为false。do…while语句的流程图如图3-11所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P80_92046.jpg?sign=1738849688-i9FlfUBSyBtJMpZUW5qR1kKNqpVCcndD-0-ac3f64888c075abc8655de8e06d03098)
图3-11 do…while语句流程图
【例3-7】(实例文件:ch03\Chap3.7.txt)do…while语句应用实例。
public class Test { public static void main(String[] args) { int x = 1; //定义变量x,初始值为1 do { System.out.println("x = " + x); //打印x的值 x++; //将x的值自增 } while (x <= 4); //循环条件 } }
程序运行结果如图3-12所示。
提示:while语句属于先判断后执行,而do…while语句先执行一次,而后再进行判断。do…while循环和while循环能实现同样的功能。然而在程序运行过程中,这两种语句还是有差别的。如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体会执行一次。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P81_12424.jpg?sign=1738849688-MewmGJEm5JFNQounK2bqHB7dDw296YH6-0-5325f8a5069b34a954a806a3085a1f4b)
图3-12 do…while语句应用实例
3.4.3 for语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P81_12492.jpg?sign=1738849688-k8VybUTu4zu5VGNfBNgbyyuVJSoouCM9-0-cc32e7196c61205032ed3d3512b6c2a7)
虽然所有循环结构都可以用while或者do…while表示,但Java还提供了另一种语句——for循环,使一些循环结构变得更加简单。for循环执行的次数是在执行前就确定的。语法格式如下:
for(初始化表达式; 循环条件; 循环控制变量) { 语句 }
for关键字后面()中包括3部分内容:初始化表达式、循环条件和循环控制变量,它们之间用“;”分隔,{}中的语句为循环体。关于for循环有以下几点说明:
- 最先执行初始化步骤。可以声明一种类型,可以初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测循环条件的值。如果为true,循环体被执行;如果为false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次检测布尔表达式。循环执行上面的过程。
【例3-8】(实例文件:ch03\Chap3.8.txt)for语句应用实例。
public class Test { public static void main(String[] args) { for (int x = 10; x < 20; x++) { System.out.print("value of x : " + x); System.out.print("\n"); } } }
程序运行结果如图3-13所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P82_12508.jpg?sign=1738849688-0pWwpjcoU5kzDjmMsaUWrFzxGGA5hnBi-0-47f4b3d1b52530c5fd8e7be1f077df7b)
图3-13 for语句应用实例
3.4.4 增强for语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P82_12636.jpg?sign=1738849688-pigbW0WXlvzqW1pJHuADy5o013QUqNYD-0-d06c3b31045c3e82d4956991a594b486)
Java 5引入了一种主要用于数组的增强for语句。语法格式如下:
for(声明语句 : 表达式) { 语句 }
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块内,其值与此时数组元素的值相等。
表达式:是要访问的数组名,或者是返回值为数组的方法。
【例3-9】(实例文件:ch03\Chap3.9.txt)增强for语句应用实例。
public class Test { public static void main(String[] args) { int[] numbers = { 10, 20, 30, 40, 50 }; for (int x : numbers) { System.out.print(x); System.out.print(","); } System.out.print("\n"); String[] names = { "James", "Larry", "Tom", "Lacy" }; for (String name : names) { System.out.print(name); System.out.print(","); } } }
程序运行结果如图3-14所示。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P83_12640.jpg?sign=1738849688-zqvms8gkaa4hUAzAF8zC2NkKiGFHOrBL-0-b31474818c73de15f460f6f5ee6b23b8)
图3-14 增强for语句实例
3.5 跳转语句
在Java语言中,支持3种跳转语句:break、continue和return语句,这些语句把控制转移到程序的其他部分。
3.5.1 break语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P83_12741.jpg?sign=1738849688-XkECbbxARcglHoPagcNsR9Nw2XNcFEYN-0-d195a075d9721aa2c7909eb3dc6eace2)
break语句主要用在循环语句或者switch语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。break的用法很简单,语法格式如下:
break;
在Java中,break语句有3种作用:
- 在switch语句中,它被用来终止一个语句序列。
- 它能被用来退出一个循环。
- 它能作为一种“先进”的goto语句来使用。
【例3-10】(实例文件:ch03\Chap3.10.txt)break语句应用实例。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P83_92057.jpg?sign=1738849688-JoUxPuC93erVNUgTzcb1B98z43HwlGyg-0-80cefc69137f9de9e55772267608210d)
程序运行结果如图3-15所示。在本实例中,通过while循环显示x的值,当x的值为3时,使用break语句跳出循环,因此显示结果中没有出现“x=4”。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P83_12732.jpg?sign=1738849688-bXXK2kZsM0B8rIPBhXB8Vmr4AKEnE35X-0-436873abab0a2d707fa99af83de01d65)
图3-15 break语句应用实例
3.5.2 continue语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P84_12831.jpg?sign=1738849688-4lBKhtNDMCjjqfPTCcd0fQlW33ZQ7AZW-0-c386ede5f0839312b43919b16638c732)
continue语句适用于任何循环控制结构中,作用是让程序立刻跳转到下一次循环的迭代。在for循环中,continue语句使程序立即跳转到下一次循环中。在while或者do…while循环中,程序立即跳转到布尔表达式的判断语句。
break语句和continue语句的区别:break语句是跳出当前层循环,终结整个循环,也不再判断循环条件是否成立;continue语句则是结束本次循环,不再运行continue之后的语句,然后重新回到循环的起点,判断循环条件是否成立,继续运行。
【例3-11】(实例文件:ch03\Chap3.11.txt)continue语句应用实例。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P84_92060.jpg?sign=1738849688-C68MCTsLcCma0ps0jpFHxLGiviQJVrGE-0-3348ed4c58ab703763cfa92b704a0644)
程序运行结果如图3-16所示。在本实例中,使用for循环让变量i的值在1~100内循环。在循环过程中,当i的值为偶数时,执行continue语句结束本次循环进入下一次循环;当i的值为奇数时,sum和i进行累加,最终得到1~100的所有奇数之和,显示sum=2500。
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P84_12819.jpg?sign=1738849688-63vV3vovTBA0hpvEaym9rr4B45M0BE2i-0-b0a781691c2f6c85858a32a0603fb1b1)
图3-16 continue语句应用实例
3.5.3 return语句
![](https://epubservercos.yuewen.com/1E82D1/13043251803825806/epubprivate/OEBPS/Images/Figure-P84_12832.jpg?sign=1738849688-Gb6mZpmJuDHEMbgJfj6hNY0zZhMHNrhP-0-8cbe27f6f970eb4dad6dc2407010c78b)
return语句作为一个无条件的分支,无须判断条件即可发生。return语句主要有两个用途:一是用来表示一个方法返回的值(假定返回值类型不是void),二是它导致该方法退出并返回值。
根据方法的定义,每一个方法都有返回类型,该类型可以是基本类型,也可以是对象类型,同时每个方法都必须有一个结束标志,return起到了这个作用。在返回类型为void的方法中有一个隐含的return语句,因此,在void方法中return可以省略不写。
3.6 就业面试解析与技巧
3.6.1 面试解析与技巧(一)
面试官:在Java中,如何跳出当前的多重嵌套循环?
应聘者:可以使用break或者return语句。
3.6.2 面试解析与技巧(二)
面试官:break语句和continue语句有什么区别?
应聘者:在循环体中,break语句是跳出循环,即结束整个循环;而continue语句是跳出本次循环,执行下一次循环。