所有的条件语句都利用条件表达式的“真”或“假”来决定执行路径。
if-else 语句是控制程序执行流程最基本的形式。 其中 else 是可选的,因此可以有两种形式的 if 。代码示例:
if(Boolean-expression)
“statement”
或
if(Boolean-expression)
“statement”
else
“statement”
布尔表达式(Boolean-expression)必须生成 boolean 类型的结果,执行语句 statement 既可以是以分号 ; 结尾的一条简单语句,也可以是包含在大括号 {} 内的的复合语句 —— 封闭在大括号内的一组简单语句。
—PS:还是写大括号 {} 吧,结构更清晰些
else if 并非新关键字,它仅是 else 后紧跟的一条新 if 语句。
—PS:if-else if-else if-else if------else,你看你也吐
while,do-while 和 for 用来控制循环语句(有时也称迭代语句)。只有控制循环的布尔表达式计算结果为 false ,循环语句才会停止。
while
while 循环的形式是:
while(Boolean-expression)
statement
执行语句会在每一次循环前,判断布尔表达式返回值是否为 true 。
do-while
do-while 的格式如下:
do
statement
while(Boolean-expression);
while 和 do-while 之间的唯一区别是:即使条件表达式返回结果为 false , do-while 语句也至少会执行一次。 在 while 循环体中,如布尔表达式首次返回的结果就为 false ,那么循环体内的语句不会被执行。实际应用中,while 形式比 do-while 更为常用。
—PS:do-while 是先干了再说
for
for 循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。随后,它会执行布尔表达式,并在每次迭代结束时,进行某种形式的步进。for 循环的形式是:
for(initialization; Boolean-expression; step)
statement
初始化 (initialization) 表达式、布尔表达式 (Boolean-expression) ,或者步进 (step) 运算,都可以为空。每次迭代之前都会判断布尔表达式的结果是否成立。一旦计算结果为 false ,则跳出 for 循环体并继续执行后面代码。 每次循环结束时,都会执行一次步进。
—PS:fori
在 for 循环的初始化和步进控制中定义多个变量。我们可以使用逗号分隔多个语句,并按顺序计算这些语句。注意:要求定义的变量类型相同。代码示例:
public class CommaOperator {
public static void main(String[] args) {
for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
System.out.println("i = " + i + " j = " + j);
}
}
}
输出结果:
i = 1 j = 11
i = 2 j = 4
i = 3 j = 6
i = 4 j = 8
无论在初始化还是在步进部分,语句都是顺序执行的。
—PS:这种我是没用到过
Java 5 引入了更为简洁的“增强版 for 循环”语法来操纵数组和集合。
for-in 无需你去创建 int 变量和步进来控制循环计数。
代码示例:
for(float x : f) { }
for-in 语法可以节省我们编写代码的时间。 更重要的是,它提高了代码可读性以及更好地描述代码意图(获取数组的每个元素)而不是详细说明这操作细节(创建索引,并用它来选择数组元素) 本书推荐使用 for-in 语法。
—PS:确实好使
return 关键字有两方面的作用:
指定一个方法返回值 (在方法返回类型非 void 的情况下);
退出当前 方法,并返回作用 1 中值。
如果在方法签名中定义了返回值类型为 void,那么在代码执行结束时会有一个隐式的 return。 也就是说我们不用在总是在方法中显式地包含 return 语句。 注意:如果你的方法声明的返回值类型为非 void 类型,那么则必须确保每个代码路径都返回一个值。
在任何迭代语句的主体内,都可以使用 break 和 continue 来控制循环的流程。 其中,break 表示跳出当前循环体。而 continue 表示停止本次循环,开始下一次循环。
—PS:迭代语句-while do-while for
goto 起源于汇编(assembly language)语言中的程序控制:“若条件 A 成立,则跳到这里;否则跳到那里”。
一个源码级别跳转的 goto,为何招致名誉扫地呢?若程序总是从一处跳转到另一处,还有什么办法能识别代码的控制流程呢?
—PS:反复横跳
尽管 goto 仍是 Java 的一个保留字,但其并未被正式启用。可以说, Java 中并不支持 goto。
—PS:不好吃那就别吃了
然而,在 break 和 continue 这两个关键字的身上,我们仍能看出一些 goto 的影子。它们并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使用了相同的机制:标签。
“标签”是后面跟一个冒号的标识符。代码示例:
label1:
break 和 continue 关键字通常只中断当前循环,但若搭配标签一起使用,它们就会中断并跳转到标签所在的地方开始执行。代码示例:
label1:
outer-iteration {
inner-iteration {
// ...
break; // [1]
// ...
continue; // [2]
// ...
continue label1; // [3]
// ...
break label1; // [4]
}
}
[1] break 中断内部循环,并在外部循环结束。
[2] continue 移回内部循环的起始处。但在条件 3 中,continue label1 却同时中断内部循环以及外部循环,并移至 label1 处。
[3] 随后,它实际是继续循环,但却从外部循环开始。
[4] break label1 也会中断所有循环,并回到 label1 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。
大家要记住的重点是:在 Java 里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 break 或 continue。
—PS:标签的使用概率很低,知道有这么个东西就行,反复横跳容易懵逼
switch 有时也被划归为一种选择语句。根据整数表达式的值,switch 语句可以从一系列代码中选出一段去执行。它的格式如下:
switch(integral-selector) {
case integral-value1 : statement; break;
case integral-value2 : statement; break;
case integral-value3 : statement; break;
case integral-value4 : statement; break;
case integral-value5 : statement; break;
// ...
default: statement;
}
其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,switch 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相符的,就执行 default 语句。
在上面的定义中,大家会注意到每个 case 均以一个 break 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 switch 语句的一种传统方式,但 break 是可选的。若省略 break, 会继续执行后面的 case 语句的代码,直到遇到一个 break 为止。
选择因子必须是 int 或 char 那样的整数值。对于非整数类型(Java 7 以上版本中的 String 型除外),则必须使用一系列 if 语句。
—PS:想起了被 if-else 支配的恐惧
Java 7 增加了在字符串上 switch 的用法。
public class StringSwitch {
public static void main(String[] args) {
String color = "red";
// 老的方式: 使用 if-then 判断
if ("red".equals(color)) {
System.out.println("RED");
} else if ("green".equals(color)) {
System.out.println("GREEN");
} else if ("blue".equals(color)) {
System.out.println("BLUE");
} else if ("yellow".equals(color)) {
System.out.println("YELLOW");
} else {
System.out.println("Unknown");
}
// 新的方法: 字符串搭配 switch
switch (color) {
case "red":
System.out.println("RED");
break;
case "green":
System.out.println("GREEN");
break;
case "blue":
System.out.println("BLUE");
break;
case "yellow":
System.out.println("YELLOW");
break;
default:
System.out.println("Unknown");
break;
}
}
}