集册 Java 精简入门教程 条件/控制/循环语句

条件/控制/循环语句

欢马劈雪     最近更新时间:2020-08-21 10:56:31

558

在本节中,将了解可用来告诉 Java 程序,您希望它们根据不同的输入来执行何种操作的各种语句和运算符。

关系和条件运算符

Java 语言提供了可在代码中用来制定决策的运算符和控制语句。代码中的决策常常以一个 Boolean 表达式 开始 — 也即一个计算为 truefalse 的表达式。这些表达式使用 关系运算符 (将一个操作数或表达式与另一个比较)和 条件运算符

表 3 列出了 Java 语言的关系和条件运算符。

表 3. 关系和条件运算符
运算符用法返回 true 的条件……



>a > ba 大于 b



>=a >= ba 大于或等于 b



<a < ba 小于 b



<=a <= ba 小于或等于 b



==a == ba 等于 b



!=a != ba 不等于 b



&&a && b如果 ab 都为 true,则有条件地计算 b (如果 a 为 false,则不计算 b






a
b如果 ab 为 true,则有条件地计算 b (如果 a 为 true,则不计算 b
!aa 为 false



&a & b如果 ab 都为 true,则始终计算 b





ab如果 ab 为 true,则始终计算 b

^a ^ bab 不同



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,则程序执行下一个语句。

在本例中,只有在运行代码的计算机的 LocaleLocale.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 中,所有实例(即非静态)方法都可以访问 someClassVariablesomeParametersomeMethod 内是可见的,但在该方法外不可见,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 循环
  • dowhile 循环

for 循环

Java 语言中的基本循环构造是 for 语句。可以使用 for 语句迭代一个值范围,以确定执行多少次循环 for 循环的抽象语法是:

for (initialization; loopWhileTrue; executeAtBottomOfEachLoop) {
  statementsToExecute
}

在循环的 开头 ,执行初始化语句(多个初始化语句可使用逗号分开)。 只要 loopWhileTrue(一个必须计算为 truefalse 的 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) 在循环结束前不会执行检查。

循环终止

展开阅读全文