在本节中,将了解可用来告诉 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) 在循环结束前不会执行检查。