第3章 程序的运行轨迹——Java语言的流程控制
◎ 本章教学微视频:14个 52分钟
学习指引
在Java中,程序之所以能够按照人们的意愿执行,主要是依靠程序的控制结构。无论多么复杂的程序,都是由这些基本的语句组成的。本章介绍Java语言的流程控制,主要内容为流程控制的3种方式——程序的顺序结构、分支结构和循环结构。
重点导读
- 熟悉Java程序运行的流程控制方式。
- 掌握Java程序运行的顺序结构。
- 掌握Java程序运行的分支结构。
- 掌握Java程序运行的循环结构。
- 掌握Java程序运行的跳转语句。
3.1 流程控制
Java程序的流程控制包括顺序控制、条件控制和循环控制。顺序控制是从头到尾依次执行每条语句操作。条件控制是基于条件选择执行语句,如果条件成立,则执行操作A,反之则执行操作B。循环控制又称为回路控制,是根据循环初始条件和终结要求执行循环体内的操作。
具体地讲,程序流程控制语句分为3类:分支语句,包括if语句和switch语句;循环语句,包括for语句、while语句和do…while语句;跳转语句,包括break语句、continue语句和return语句。
3.2 顺序结构
顺序结构是最简单、最常用的程序结构,只要按照解决问题的步骤写出相应的语句就行,它的执行顺序是自上而下依次执行。有一些程序并不按顺序执行语句,这个过程称为控制的转移,它涉及了另外两类程序的控制结构,即分支结构和循环结构。
3.3 分支结构
在实际的程序设计中,根据输入数据和中间结果的不同情况需要选择不同的语句执行,在这种情况下,必须根据某个变量或表达式的值做出判断,以决定执行哪些语句和跳过哪些语句不执行。Java有两种分支结构,分别是if语句和switch语句。
3.3.1 if语句
一个if语句包含一个布尔表达式和一条或多条语句。其语法格式如下:
if(布尔表达式) { 语句//如果布尔表达式为true将执行的语句 }
如果布尔表达式的值为true,则执行if语句大括号中的语句,否则执行if语句后面的代码。if语句流程图如图3-1所示。
图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所示。
图3-2 if语句应用实例
3.3.2 if…else语句
if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句会被执行。语法格式如下:
if(布尔表达式){ 语句1 //如果布尔表达式的值为true将执行的语句 }else{ 语句2 //如果布尔表达式的值为false将执行的语句 }
if…else表示判断两种情况:要么满足if的条件;要么不满足if的条件,此时执行else语句。if…else语句流程图如图3-3所示。
图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语句内的代码。
图3-4 if…else语句应用实例
3.3.3 if…else if…else语句
if语句后面可以跟else if…else语句,这种语句可以检测多种可能的情况,也被称为多条件判断语句或多分支语句。if多条件判断语句流程图如图3-5所示。
图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所示。
图3-6 多条件判断语句应用实例
提示:多条件判断语句就是利用多个条件进行判断,如果有一个条件满足,则执行,不满足则继续向后判断。
3.3.4 嵌套的if…else语句
使用嵌套的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所示。
图3-7 嵌套的if…else语句应用实例
3.3.5 switch语句
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所示。
图3-8 switch语句应用实例
提示:使用switch语句的时候,如果满足条件的语句中没有break,那么就会在执行完满足条件的case语句后,继续判断下一个case语句的值是否满足条件,一直到switch语句结束或者是遇到break为止。
3.4 循环结构
顺序结构的程序语句只能被执行一次。如果想要使同样的操作执行多次,就需要使用循环结构。Java中有3种主要的循环结构,分别是while循环、do…while循环、for循环,另外,在Java 5中引入了一种主要用于数组的增强型for循环。
3.4.1 while语句
while是最基本的循环,只要布尔表达式为true,循环体会一直执行下去。语法格式如下:
while( 布尔表达式 ) { 语句//循环内容 }
while语句流程图如图3-9所示。
图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语句一定要在循环内有让条件不成立的代码,否则就会陷入死循环。
图3-10 while语句应用实例
3.4.2 do…while语句
对于while语句而言,如果不满足条件,则不能进入循环。但有时候需要即使不满足条件也至少执行一次。do…while循环和while循环相似,不同的是,do…while循环至少会执行一次。语法格式如下:
do { 语句 }while(布尔表达式);
注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。如果布尔表达式的值为true,则语句块一直执行,直到布尔表达式的值为false。do…while语句的流程图如图3-11所示。
图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循环的循环体会执行一次。
图3-12 do…while语句应用实例
3.4.3 for语句
虽然所有循环结构都可以用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所示。
图3-13 for语句应用实例
3.4.4 增强for语句
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所示。
图3-14 增强for语句实例
3.5 跳转语句
在Java语言中,支持3种跳转语句:break、continue和return语句,这些语句把控制转移到程序的其他部分。
3.5.1 break语句
break语句主要用在循环语句或者switch语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。break的用法很简单,语法格式如下:
break;
在Java中,break语句有3种作用:
- 在switch语句中,它被用来终止一个语句序列。
- 它能被用来退出一个循环。
- 它能作为一种“先进”的goto语句来使用。
【例3-10】(实例文件:ch03\Chap3.10.txt)break语句应用实例。
程序运行结果如图3-15所示。在本实例中,通过while循环显示x的值,当x的值为3时,使用break语句跳出循环,因此显示结果中没有出现“x=4”。
图3-15 break语句应用实例
3.5.2 continue语句
continue语句适用于任何循环控制结构中,作用是让程序立刻跳转到下一次循环的迭代。在for循环中,continue语句使程序立即跳转到下一次循环中。在while或者do…while循环中,程序立即跳转到布尔表达式的判断语句。
break语句和continue语句的区别:break语句是跳出当前层循环,终结整个循环,也不再判断循环条件是否成立;continue语句则是结束本次循环,不再运行continue之后的语句,然后重新回到循环的起点,判断循环条件是否成立,继续运行。
【例3-11】(实例文件:ch03\Chap3.11.txt)continue语句应用实例。
程序运行结果如图3-16所示。在本实例中,使用for循环让变量i的值在1~100内循环。在循环过程中,当i的值为偶数时,执行continue语句结束本次循环进入下一次循环;当i的值为奇数时,sum和i进行累加,最终得到1~100的所有奇数之和,显示sum=2500。
图3-16 continue语句应用实例
3.5.3 return语句
return语句作为一个无条件的分支,无须判断条件即可发生。return语句主要有两个用途:一是用来表示一个方法返回的值(假定返回值类型不是void),二是它导致该方法退出并返回值。
根据方法的定义,每一个方法都有返回类型,该类型可以是基本类型,也可以是对象类型,同时每个方法都必须有一个结束标志,return起到了这个作用。在返回类型为void的方法中有一个隐含的return语句,因此,在void方法中return可以省略不写。
3.6 就业面试解析与技巧
3.6.1 面试解析与技巧(一)
面试官:在Java中,如何跳出当前的多重嵌套循环?
应聘者:可以使用break或者return语句。
3.6.2 面试解析与技巧(二)
面试官:break语句和continue语句有什么区别?
应聘者:在循环体中,break语句是跳出循环,即结束整个循环;而continue语句是跳出本次循环,执行下一次循环。