条件运算符和控制语句
目标
- 知道何时和如何使用关系运算符、条件运算符和控制语句
- 了解变量范围的概念和它的基本规则
- 熟悉三元运算符
关系和条件运算符
Java 语言提供了运算符和控制语句,可在代码中使用它们来制定决策。代码中的决策通常从一个布尔表达式(一个计算为 true 或 false 的表达式)开始。这些表达式使用关系运算符(用于将一个操作数与另一个操作数比较)和条件运算符。
表 1 列出了 Java 语言中的关系和条件运算符。
表 1. 关系和条件运算符
运算符 | 用法 | 返回 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 语句的使用,它计算圆括号内的一个布尔表达式。如果该表达式计算为 true,那么程序会执行下一个语句。
在本例中,仅在运行代码的计算机的 Locale 是 Locale.US 时,才需要执行一条语句。如果需要执行多条语句,可以使用花括号形成一个复合语句。复合语句将多条语句分组到一个中,而且复合语句也可以包含其他复合语句。
变量范围
Java 应用程序中的每个变量都拥有范围 或局部化的命名空间,在代码中,可以在该范围内通过名称访问它。在该空间外,该变量就位于范围之外,如果尝试访问它,将得到编译器错误。Java 语言中的范围级别由声明变量的位置来定义,如清单 1 所示。
清单 1. 变量范围
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 拥有代码块范围,因为代码块(由 { 和 } 限定)定义了范围边界。
范围有许多规则,清单 1 给出了最常用的规则。请花几分钟熟悉一下它们。
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。每条语句均不允许采用复合语句形式。
如果 conditional 语句的计算结果为 true,则需要执行一条语句,如果不为 true,则执行另一条语句,在知道这种情况时,三元运算符很方便。三元运算符常常用于初始化一个变量(比如一个返回值),类似这样:
public int getHeight() {
return (gender.equals("MALE")) ? (height + 2) : height;
}
问号后面的圆括号不是必需的,但它们会让代码更可容易理解。