读书笔记-《ON JAVA 中文版》-摘要4

第五章 控制流

1. true 和 false

所有的条件语句都利用条件表达式的“真”或“假”来决定执行路径。

2. if-else

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,你看你也吐

3. 迭代语句

whiledo-whilefor 用来控制循环语句(有时也称迭代语句)。只有控制循环的布尔表达式计算结果为 false ,循环语句才会停止。

while

while 循环的形式是:

while(Boolean-expression) 
	statement

执行语句会在每一次循环前,判断布尔表达式返回值是否为 true 。

do-while

do-while 的格式如下:

do 
    statement 
while(Boolean-expression);

whiledo-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:这种我是没用到过

4. for-in 语法

Java 5 引入了更为简洁的“增强版 for 循环”语法来操纵数组和集合。

for-in 无需你去创建 int 变量和步进来控制循环计数。

代码示例:

for(float x : f) { }

for-in 语法可以节省我们编写代码的时间。 更重要的是,它提高了代码可读性以及更好地描述代码意图(获取数组的每个元素)而不是详细说明这操作细节(创建索引,并用它来选择数组元素) 本书推荐使用 for-in 语法。

—PS:确实好使

5. return

return 关键字有两方面的作用:

  1. 指定一个方法返回值 (在方法返回类型非 void 的情况下);

  2. 退出当前 方法,并返回作用 1 中值。

如果在方法签名中定义了返回值类型为 void,那么在代码执行结束时会有一个隐式的 return。 也就是说我们不用在总是在方法中显式地包含 return 语句。 注意:如果你的方法声明的返回值类型为非 void 类型,那么则必须确保每个代码路径都返回一个值。

6. break 和 continue

在任何迭代语句的主体内,都可以使用 breakcontinue 来控制循环的流程。 其中,break 表示跳出当前循环体。而 continue 表示停止本次循环,开始下一次循环。

—PS:迭代语句-while do-while for

7. 臭名昭著的 goto

goto 起源于汇编(assembly language)语言中的程序控制:“若条件 A 成立,则跳到这里;否则跳到那里”。

一个源码级别跳转的 goto,为何招致名誉扫地呢?若程序总是从一处跳转到另一处,还有什么办法能识别代码的控制流程呢?

—PS:反复横跳

尽管 goto 仍是 Java 的一个保留字,但其并未被正式启用。可以说, Java 中并不支持 goto

—PS:不好吃那就别吃了

在这里插入图片描述

然而,在 breakcontinue 这两个关键字的身上,我们仍能看出一些 goto 的影子。它们并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使用了相同的机制:标签。

“标签”是后面跟一个冒号的标识符。代码示例:

label1:

breakcontinue 关键字通常只中断当前循环,但若搭配标签一起使用,它们就会中断并跳转到标签所在的地方开始执行。代码示例:

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 里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 breakcontinue

—PS:标签的使用概率很低,知道有这么个东西就行,反复横跳容易懵逼

8. switch

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 为止。

选择因子必须是 intchar 那样的整数值。对于非整数类型(Java 7 以上版本中的 String 型除外),则必须使用一系列 if 语句。

—PS:想起了被 if-else 支配的恐惧

9. switch 字符串

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;
        }
    }
}

在这里插入图片描述


版权声明:本文为JustDI0209原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。