在本节中,将了解可用来告诉 Java 程序,您希望它们根据不同的输入来执行何种操作的各种语句和运算符。
关系和条件运算符
Java 语言提供了可在代码中用来制定决策的运算符和控制语句。代码中的决策常常以一个 Boolean 表达式 开始 — 也即一个计算为 true
或 false
的表达式。这些表达式使用 关系运算符 (将一个操作数或表达式与另一个比较)和 条件运算符 。
表 3 列出了 Java 语言的关系和条件运算符。
表 3. 关系和条件运算符
运算符 | 用法 | 返回 true 的条件…… | ||||
---|---|---|---|---|---|---|
> | a > b | a 大于 b | ||||
>= | a >= b | a 大于或等于 b | ||||
< | a < b | a 小于 b | ||||
<= | a <= b | a 小于或等于 b | ||||
== | a == b | a 等于 b | ||||
!= | a != b | a 不等于 b | ||||
&& | a && b | 如果 a 和 b 都为 true,则有条件地计算 b (如果 a 为 false,则不计算 b ) | ||||
a | b | 如果 a 或 b 为 true,则有条件地计算 b (如果 a 为 true,则不计算 b ) | ||||
! | !a | a 为 false | ||||
& | a & b | 如果 a 和 b 都为 true,则始终计算 b | ||||
a | b | 如果 a 或 b 为 true,则始终计算 b | ||||
^ | a ^ b | a 和 b 不同 |
if 语句
有了大量运算符后,是时候使用它们了。下面这段代码展示了在将一种逻辑添加到 Person
对象的 getHeight()
访问器时发生的情况:
public int getHeight() {
int ret = height;
// If locale of the computer this code is running on is U.S.,
if (Locale.getDefault().equals(Locale.US))
ret /= 2.54;// convert from cm to inches
return ret;
}
如果当前地区是在美国(未使用公制),将 height
(以厘米为单位)的内部值转换为英寸可能更有意义。这个(人为设计的)示例演示了 if
语句的使用,该语句计算圆括号中的一个 Boolean 表达式。如果该表达式计算为 true
,则程序执行下一个语句。
在本例中,只有在运行代码的计算机的 Locale
是 Locale.US
时,才需要执行一条语句。如果需要执行多条语句,可使用花括号来形成一条 复合语句 。复合语句将许多语句组合成一条语句 — 而且复合语句也可包含其他复合语句。
变量范围
Java 应用程序中的每个变量都拥有 范围 或本地化的名称空间,在该范围内,可以在代码中通过名称访问该变量。在该空间外,该变量就位于 范围之外 ,如果尝试访问它,则会获得编译错误。Java 语言中的范围级别由声明变量的位置来定义,如清单 7 所示。
清单 7. 变量范围
public class SomeClass {
private String someClassVariable;
public void someMethod(String someParameter) {
String someLocalVariable = "Hello";
if (true) {
String someOtherLocalVariable = "Howdy";
}
someClassVariable = someParameter; // legal
someLocalVariable = someClassVariable; // also legal
someOtherLocalVariable = someLocalVariable;// Variable out of scope!
}
public void someOtherMethod() {
someLocalVariable = "Hello there";// That variable is out of scope!
}
}
在 SomeClass
中,所有实例(即非静态)方法都可以访问 someClassVariable
。 someParameter
在 someMethod
内是可见的,但在该方法外不可见,someLocalVariable
也是如此。在 if
代码块内,声明了 someOtherLocalVariable
,在 if
代码块外,它就超出了范围。出于这个原因,我们可以说 Java 拥有 代码块范围 ,因为代码块(由 {
和 }
限定)定义了范围边界。
范围有许多规则,清单 7 给出了最常用的规则。请花几分钟熟悉一下它们。
else 语句
有时在程序的控制流中,您希望仅在一个特定表达式未计算为 true
时执行操作。这时使用 else
将很方便:
public int getHeight() {
int ret;
if (gender.equals("MALE"))
ret = height + 2;
else {
ret = height;
Logger.getLogger("Person").info("Being honest about height...");
}
return ret;
}
else
语句的原理与 if
相同,因为程序仅执行它遇到的下一条语句。在本例中,两条语句分组到一个复合语句中(请注意花括号),然后由程序执行。
也可以使用 else
执行一次额外的 if
检查:
if (conditional) {
// Block 1
} else if (conditional2) {
// Block 2
} else if (conditional3) {
// Block 3
} else {
// Block 4
} // End
如果 conditional
计算为 true
,则执行 Block 1
,程序跳到最后一个花括号(通过 // End
表示)之后的语句。如果 conditional
未 计算为 true
,则计算 conditional2
。如果 conditional2
为 true,则计算 Block 2
,并且程序跳到最后一个花括号之后的语句。如果 conditional2
不为 true,则程序前进到 conditional3
,依此类推。只有在所有 3 个条件都失败时,才执行 Block 4
。
三元运算符
Java 语言提供了一个方便的运算符来执行简单的 if
/ else
语句检查。这个运算符的语法是:
(conditional) ? statementIfTrue : statementIfFalse;
如果 conditional
计算为 true
,则执行 statementIfTrue
;否则执行 statementIfFalse
。每条语句都不允许使用复合语句形式。
在获知如果条件计算为 true
,需要执行一条语句,如果不为 true,则执行另一条语句时,使用三元运算符很方便。三元运算符通常用于初始化一个变量(比如一个返回值),类似这样:
public int getHeight() {
return (gender.equals("MALE")) ? (height + 2) : height;
}
问号后面的圆括号不是必需的,但它们使代码变得更可容易理解。
循环
除了能够对程序应用各种条件之外,还可以根据各种 if
/ then
场景得到不同的结果,您有时还想让代码反复执行同一件事,直到作业完成。在本节中,将了解用于迭代代码或多次执行代码的构造:
什么是循环?
循环是一种编程构造,它在满足某个特定条件(或某组条件)时反复执行。例如,您可能要求程序读取数据文件中的所有记录,或者依次处理数组中的每个元素。(下一节将介绍数组。)
3 种循环构造使迭代代码或多次执行代码成为可能:
for
循环while
循环do
…while
循环
for 循环
Java 语言中的基本循环构造是 for
语句。可以使用 for
语句迭代一个值范围,以确定执行多少次循环 for
循环的抽象语法是:
for (initialization; loopWhileTrue; executeAtBottomOfEachLoop) {
statementsToExecute
}
在循环的 开头 ,执行初始化语句(多个初始化语句可使用逗号分开)。 只要 loopWhileTrue
(一个必须计算为 true
或 false
的 Java 条件表达式)为 true,就会执行该循环。在循环的 底部 ,执行 executeAtBottomOfEachLoop
。
例如,如果想让清单 8 中的 main()
方法中的代码执行 3 次,可使用一个 for
循环。
清单 8. 一个 for
循环
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());
}
}
在清单 8 的开头,局部变量 aa
初始化为 0。此语句仅在初始化该循环时执行一次。然后,该循环继续执行 3 次,每次都将 aa
递增 1。
在下一节将会看到,可使用一种替代性的 for
循环语法来循环执行实现 Iterable
接口的构造(比如数组和其他 Java 实用程序类)。就现在而言,只需注意清单 8 中的 for
循环语法的用法。
while 循环
while
循环的语法是:
while (condition) {
statementsToExecute
}
您可能已经猜到,如果 condition 计算为 true
,则执行该循环。在每个迭代的顶部(即执行任何语句之前),计算该条件。如果该条件计算为 true
,则执行循环。因此,如果一个 while
循环的条件表达式至少有一次未计算为 true,则不能执行该循环。
再次看看清单 8 中的 for
循环。作为对比,清单 9 使用了一个 while
循环来获取同样的结果。
清单 9. 一个 while
循环
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
循环,如清单 10 所示。
清单 10. 一个 do...while
循环
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
) 在循环结束前不会执行检查。