Java 流程控制语句

Table of Contents

从结构化程序设计角度出发,程序有 3 种结构:顺序结构、选择结构和循环结构。

若是在程序中没有给出特别的执行目标,系统则默认自上而下一行一行地执行程序,这类程序的结构就称为 顺序结构

语句

按照语句的组成部分,可以将顺序结构中语句分为 3 大类:表达式语句、空语句和复合语句。

在 Java 中,语句是最小的组成单位,每个语句必须使用分号作为结束符。 除此这外,Java 对语句无任何其他限制。

1. 空语句

所谓空语句(Empty Statement),它在程序中什么都不做,也不包含具有实际性的语句。在程序中,空语句主要用来作为空循环体。格式如下:

1: ;                               // 其实就是一个分号

2. 表达式语句

以下是一些表达式的示例语句:

1: 3.1415926;
2: (a+b)/2;
3: x*y*z-y+(20-x);

这些表达式能够被 Java 编译器识别,但是由于没有对程序进行任何操作,因此无任何意义。

一般表达式语句应该能完成一个操作,如修改变量的值或作为函数参数等。具体方法是,在表达式的左侧指定一个变量来存储表达式的值,或者将表达式传递给函数。

1: pi = 3.1415926;
2: output(pi);                      // 将pi的值传递到output()函数中作为参数
3: sum = (a + b) / 2;
4: printf("%f", sum);               // 将sum的值传递到printf()函数输出
5: temp = x * y * z - y + (20 - x); // 将表达式的值保存到temp变量中

3. 复合语句

复合语句又称为语句块,是很多个语句的组合,从而可以将多个语句看作单个语句。格式如下:

{
    statement-list  // 语句列表
}

其中, statement-list 是由一个或多个语句组成的列表,如果不存在 statement-list ,则称该语句是空的。

选择结构

i.e. 分支结构

Java 支持两种选择语句: if 语句和 switch 语句。其中 if 语句使用布尔表达式或布尔值作为分支条件来进行分支控制,而 switch 语句则用于对多个整型值进行匹配,从而实现分支控制。这些语句允许你只有在程序运行时才能知道其状态的情况下,控制程序的执行过程。

选择结构(也叫分支结构)解决了顺序结构不能判断的缺点,可以根据一个条件执行哪些语句块。

1. if 结构

最简语法格式如下:

if (条件表达式) {
    语句块;
}

其中, 条件表达式 可以是任意一种逻辑表达式(一个单纯的布尔变量或常量,或是使用关系或布尔运算符的表达式),最后返回的结果必须是一个布尔值。 语句块 可以是一条语句(此时可以省略大括号 {} ),也可是多条语句。

2. if-else 结构

语法格式如下:

if (表达式) {
    语句块1;
} else {
    语句块2;
}

3. 多条件 if-else-if 结构

语法格式如下:

if(表达式1) {
    语句块1;
} else if(表达式2) {
    语句块2;
...
} else if(表达式n) {
    语句块n;
} else {
    语句块n+1;
}

4. switch 结构

switch 语句是 Java 的多路分支语句,它提供了一个比一系列 if-else-if 语句更好的选择。

基本语法格式如下:

switch(表达式) {
    case 值1:
        语句块1;
        break;
    case 值2:
        语句块2;
        break;
    ...
    case 值n:
        语句块n;
        break;
    default:
        语句块n+1;
    break;
}

循环结构

循环是程序中的重要流程结构之一,所有流行的编程语言中都有循环语句。

Java 中采用的循环语句主要有 while、do-while 和 for ,在 Java 5 之后推出了 for-each 循环语句(for 循环的变形,专门为集合遍历而设计的)。

循环语句可能包含如下 4 个部分:

  • 初始化语句(init statement);
  • 循环条件(testexpression);
  • 循环体(bodystatement);
  • 迭代语句(iterationstatement)。

上面 4 个部分只是一般性的分类,并不是每个循环中都非常清晰地分出了这 4 个部分。

1. while 语句

while(条件表达式) {
    语句块;
}

2. do-while 语句

do-while 循环语句的特点是先执行循环体,然后判断循环条件是否成立。

do {
    语句块;
} while(条件表达式);

3. for 语句

for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。

for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句,假如条件表达式的结果为假,它的循环语句根本不会执行, 通常使用在知道循环次数的循环中

for(条件表达式1;条件表达式2;条件表达式3) {
    语句块;
}

*注意:for 关键字后面括号中的 3 个条件表达式必须用 ; 隔开。

值得指出的是,for 循环的循环迭代语句并没有与循环体放在一起,因此即使在执行循环体时遇到 continue 语句结束本次循环,循环迭代语句也一样会得到执行。

与前面循环类似的是,如果循环体只有一行语句,那么循环体的大括号可以省略。

for 语句中初始化、循环条件以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。

3.1 条件表达式 1 为空

for 语句中条件表达式 1 的作用可以在程序的其他位置给出,所以当条件表达式 1 为空时,for 语句后面括号内其他条件表达式执行的顺序不变。

3.2 条件表达式 2 为空

当 for 语句中条件表达式 2 为空时,将没有循环的终止条件。此时 for 语句会认为条件表达式 2 的值总是为真,循环无限制执行下去。因此,为了使循环达到某种条件时退出,需要在语句块中进行逻辑判断,并使用 break 语句来跳出循环,否则将产生死循环。

3.3 条件表达式 3 为空

当 for 语言中条件表达式 3 为空时,也就没有设置控制变量的表达式,即每次循环之后无法改变变量的值,此时也无法保证循环正常结束。

4. for-each 语句

foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。在遍历数组、集合方面,为开发者提供了极大的方便。

foreach 循环语句的语法格式如下:

for(类型 变量名:集合) {
    语句块;
}

其中:

  • 类型 为集合元素的类型;
  • 变量名 表示集合中的每一个元素;
  • 集合 是被遍历的集合对象或数组。
1: // 声明并初始化 int 数组
2: int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };
3: 
4: // for-each 语句
5: for (int item : numbers) {
6:     System.out.println("Count is:" + item);
7: }

for-each 语句将集合中的元素一一取出来,并保存到 item 中,这个过程中不需要使用循环变量通过数组下标访问数组中的元素,在遍历集合时简单方便许多。

foreach 循环和普通循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach 循环自动迭代数组的每个元素,当每个元素都被迭代一次后,foreach 循环自动结束。

不难看出,当使用 foreach 来迭代访问数组元素时,foreach 中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。因此,如果希望改变数组元素的值,则不能使用这种 foreach 循环。

使用 foreach 循环迭代数组元素时,并不能改变数组元素的值,因此不要对 foreach 的循环变量进行赋值。

其实,这里也不是绝对,比如说数组的元素是一个引用类型的时候,你如果修改了它的某个属性值,也是生效的。但除非你知道你在做什么,否则强烈不建议这么做。

return、break、continue 语句

1. return 语句

return 关键字并不是专门用于结束循环的,return 语句用于终止函数的执行或退出类的方法,并把控制权返回该方法的调用者。如果这个方法带有返回类型,return 语句就必须返回这个类型的值;如果这个方法没有返回值,可以使用没有表达式的 return 语句。

语法格式如下:

return 与方法相同类型的变量;

2. break 语句

break 用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到 break ,系统将完全结束该循环,开始执行循环之后的代码。

*注:在嵌套循环中,break 语句仅仅终止其所在当前层循环,并不会终止其外部循环。

在 Java 中,break 语句有 3 种作用,分别是:

  • 在 switch 语句中终止一个语句序列;
  • 使用 break 语句直接强行退出循环;
  • * 使用 break 语句实现 goto 功能。

*注:switch 循环语句中的 break 仅影响 switch 语句,不会影响循环。

3. continue 语句

continue 语句是跳过循环体中剩余的语句而强制执行下一次循环,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

*注:continue 语句只能用在 while 语句、for 语句或者 foreach 语句的循环体之中,在这之外的任何地方使用它都会引起语法错误。

4. 小结一下

  • break :表示跳出当前层循环;
  • continue :表示跳出本次循环,进入下一次循环;
  • return :跳出当前方法的循环。

Date: 2020-09-16 Wed 17:23

Author: Jack Liu

Created: 2020-09-17 Thu 07:52

Validate