什么是循环?
有时您希望代码在工作完成之前反复做同一件事。可使用循环 实现此目的。循环是一种编程结构,它在满足某个特定条件(或某组条件)时反复执行。例如,您可能要求程序读取数据文件中的所有记录,或者依次处理数组中的每个元素。(下一单元将介绍数组。)
3 种循环结构使迭代代码或多次执行它成为可能:
-
for
循环 -
while
循环 -
do
...while
循环
for 循环
Java 语言中基本的循环结构是 for
语句。可以使用 for
语句迭代一个值范围,以确定执行循环多少次。for
循环的抽象语法是:
for (initialization; loopWhileTrue; executeAtBottomOfEachLoop) {
statementsToExecute
}
|
在循环的开头,执行初始化语句(多个初始化语句可使用逗号分开)。只要 loopWhileTrue
(一个必须计算为 true
或 false
的 Java 条件表达式)为 true,就会执行该循环。在循环的底部,执行 executeAtBottomOfEachLoop
。
例如,如果希望清单 1 中的 main()
方法中的代码执行 3 次,可以使用一个 for
循环
清单 1. 一个 for
循环
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
for (int aa = 0; aa < 3; aa++)
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
}
}
|
在清单 1 的开头,局部变量 aa
被初始化为 0。此语句仅在循环初始化时执行一次。该循环然后继续执行 3 次,每次将 aa
递增 1。
在下一单元将会看到,可使用一种替代性的 for
循环语法来循环执行实现 Iterable
接口的结构(比如数组和其他 Java 实用程序类)。就现在而言,只需注意 清单 1 中的 for
循环语法的用法。
一个 while 循环
while
循环的语法是:
while (condition) {
statementsToExecute
}
|
正如您可能预料到的,如果 condition
计算为 true,则执行该循环。在每个迭代的顶部(也即在执行任何语句之前),计算该条件。如果该条件计算为 true
,则执行循环。所以如果一个 while
循环的条件表达式至少有一次未计算为 true,则可能不执行该循环。
再次看看 清单 1 中的 for
循环。作为对比,清单 2 使用了一个 while
循环来获取同样的结果。
清单 2. 一个 while
循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
}
}
|
可以看到,while
循环需要的工作比 for
循环要多。您必须初始化 aa
变量,还要记住在循环底部递增它。
do...while 循环
如果想要一个始终执行一次,然后 检查它的条件表达式的循环,可以使用 do...while
循环,如清单 3 所示。
清单 3. 一个 do...while
循环
1
2
3
4
5
6
7
8
9
10
11
12
|
int aa = 0;
do {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
} while (aa < 3);
|
条件表达式 (aa < 3
) 在循环结束前不会执行检查。
循环终止
有时,您需要在条件表达式计算为 false
之前跳出(或终止)循环。如果在一个 String
数组中搜索某个特定值,而且只想找到该值,并不关心数组的其他元素,则可能发生这种情况。对于想要跳出循环的情况,Java 语言提供了 break
语句,如清单 4 所示。
清单 4. 一条 break
语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
if (aa == 1)
break;
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
}
}
|
break
语句跳转到它所在循环外的下一条可执行语句。
继续执行循环
在 清单 4 中的(简化)例子中,您仅希望执行循环一次并跳出。也可跳过循环的单次迭代,但继续执行循环。要实现该目的,需要使用 continue
语句,如清单 5 所示。
清单 5. 一条 continue
语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
if (aa == 1)
continue;
else
aa++;
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" +
p.getGender());
}
}
|
在清单 5 中,跳过了循环的第二次迭代,但继续执行第三次迭代。举例而言,在处理记录并遇到一条您完全不想处理的记录时,使用 continue
就很方便。您可以跳过该记录并前进到下一条记录。
测试您的理解情况
- 在 第 7 单元 中,在
getName()
实现中使用concat()
方法演示了方法链。使用字符串串联(通过+
运算符)实现getName()
方法。编写一个 JUnit 测试来确保结果符合预期。 - 哪个(哪些)运算符是二元运算符?
-
++
-
+
-
%
-
--
-
+=
- a、b 和 d
- b、c 和 e
- 上述选项都不是
-
- 字符串串联 表示组合两个或更多字符串的内容形成一个更大的字符串。
- 对
- 错
- 以下哪个语句表示 “如果 a 小于或等于 b”?
-
if (a lt b)
-
if (b < a)
-
if (b +< a)
-
if (a <= b)
- 上述选项都不是
-
- 执行以下代码块后,变量
c
的值是多少?解释您的答案。
12345678910111213public int method1() {
int a = 10;
int b = 7;
int c = 0;
if (b >= a)
c++;
b = -47;
if (b > c)
c = b;
return c;
}
- 以下代码是否会被编译?解释您的答案。
1234567891011public int method2() {
int a = 0;
if (a > 0) {
int b = a;
}
int c = b;
return c;
}
- 执行以下代码块后,变量
c
的值是多少?解释您的答案。
123456789101112public boolean method3() {
boolean a = true;
boolean b = false;
boolean c;
if (a = b)
c = false;
else
c = a;
return c;
}
-
for
循环始终 至少执行一次。- 对
- 错
- 在循环的底部检查确定
do...while
循环是否继续执行的条件。- 对
- 错
- 编写一个包含
for
循环的方法,该循环从 3 开始,循环 6 次,并使用 JDKLogger
输出迭代次数(从 1 开始)及当前循环变量。使用 清单 1 作为使用Logger
的示例。使用您的Logger
输出验证结果。 - 使用不同的方法名重复问题 10 中的练习,但这次使用一个
while
循环。使用您的Logger
输出验证结果。 - 使用
do...while
循环重复问题 10 中的练习。使用您的Logger
输出验证结果。 - 编写一个包含
for
循环的方法,该循环从零 (0) 开始,循环十 (10) 次,并使用 JDKLogger
类输出迭代次数(从 1 开始)及当前循环变量。跳过第 4、5 和 9 次迭代。使用您的Logger
输出验证结果。