黑马程序员技术交流社区

标题: Java 流程控制语句总结 [打印本页]

作者: lucascgz    时间: 2015-12-5 23:31
标题: Java 流程控制语句总结
流程控制
        判断结构: if-else
        分支结构: switch
        循环结构: while, do...while, for
--------------------------------------------------------------------------------
1. 判断结构 - if
1.1 if 语句3种格式:
        ----------------------------------------
        1)        if (条件表达式)        {
                        执行语句;
                }
        ----------------------------------------
        2) if (条件表达式) {
                        执行语句;
                } else {
                        执行语句;
                }
        ----------------------------------------
        3) if (条件表达式) {
                        执行语句;
                } else if (条件表达式) {
                        执行语句;
                }
                .......
                else {
                        执行语句;
                }
--------------------------------------------------------------------------------
1.2 if-else 与三元运算符比较

当 if-else 结构有运算结果时, 可用三元运算符简写为:
        变量 = (条件表达式) ? 表达式1 : 表达式2;

与 if-else 结构相比, 三元运算符:
        好处: 可以简化有运算结果的 if-else 结构, 可以写到其他表达式中
        局限性: 因为是一个运算符, 要求运算完后必须有一个结果,
                        所以只能简化有运算结果的 if- else 结构.
--------------------------------------------------------------------------------
2. 分支结构/选择结构 - switch
2.1 switch 语句格式
        switch (表达式)        {
                case 取值1:
                        执行语句;
                        break;

                case 取值2:
                        执行语句;
                        break;

                ............

                default:
                        执行语句;
                        break;
        }
--------------------------------------------------------------------------------
2.2 switch 语句特点
        1) switch 语句选择的类型:
                JDK5.0 之前, 只支持 char, byte, short, int
                从 JDK5.0 起, 还可以支持 Character. Byte, Short, Integer 和 Enum 类型
                从 JDK7.0 起, 还可以支持 String 类型
        2) 当 switch 语句"表达式"为引用类型时, 取值不能为 null.
                        否则抛 NullPointerException
                switch 底层会调用表达式指向的对象的 equals 等方法去选择对应的分支,
                所以, 若"表达式"为 null 将导致 NullPointerException
        3) 结束 switch 语句的2种情况: 执行到 break/return/throw 或 switch 语句结束
        4) case 和 default 都表示 switch 的分支.
           case 对应特定取值的分支, 可以有多个;
           而 default 对应所有特定取值之外的分支, 只能有1个.
           > 编写时, 可任意顺序排列各分支(包括 default 分支)
                        也就是说, default 可以第1个也可以最后一个
           > 选择时, 先匹配所有 case, 若所有 case 都不匹配才选择 default
           > 执行时, 先执行匹配分支, 然后向下执行后面的分支(即使不匹配),
                        直到 break 或 switch 语句结尾.
          
        public void test() {
                int num = 3;
                /*
                 * 编写时, 可任意顺序排列各分支. default 可以不是最后一个分支
                 * 选择时, num 为 3, 所以选择了 default 分支.
                 *                一旦选择分支后, 便不再判断 label
                 * 执行时, 先执行 default 分支, 打印 nono;
                 *                 接下来执行 case 2 分支, 打印 1, 然后遇到了 break, 跳出 switch.
                 */
                switch (num) {
                case 0:
                        System.out.println(0);
                default:
                        System.out.println("nono"); // 执行
                case 2: // label 仅用于选择分支. 执行分支语句时没用了
                        System.out.println(1); // 执行
                        break; // 执行. 在这里跳出 switch
                case 1:
                        System.out.println(2);
                }
//                结果:
//                        nono
//                        1
        }
--------------------------------------------------------------------------------
2.3 if 和 switch 比较
        (1) switch 比 if 效率稍高
        (2) if 能判断区间, switch 不能
        (3) if 能判断 boolean 型条件, switch 不能
        (4) switch 与 if 使用场合不同:
                > 当值不多, 且值类型为 switch 支持的类型时建议用 switch 语句
                > 其余用 if 语句
--------------------------------------------------------------------------------
3. while 语句和 do...while 语句

3.1 while 语句格式:
        /*

        定义初始化表达式;
        while (条件表达式) {
                循环体(执行语句);
        }

        */
        注意:
                (1) 循环体里必须改变变量使得循环能结束!!!
                (2) while 语句的 while 后面千万不能有分号, 否则死循环
                        (非语法错误, 能编译运行, 但死循环)

3.2 do...while 语句格式:
        /*

        do {
                循环体;
        }
        while(条件表达式);

        */
        注意:
                (1) 循环体里必须改变变量使得循环能结束!!!
                (2) do...while 语句的 while 后面必须有分号";", 否则编译错误.

3.3 while 与 do...while 区别:
        while 先判断条件, 只有条件满足才执行循环体.
        do...while 先执行循环体, 再判断条件, 若条件满足, 再继续执行循环体.
        简单一句话:        do...while 无论条件是否满足, 循环体至少执行1次.
3.4 两种 while 易错点
        > do...while 语句的 while 后必须有分号“;”, 否则编译错误
        > while 语句的 while 后有分号“;”将死循环(因循环体为空. 非语法错误, 编译可通过)
--------------------------------------------------------------------------------
4. for 语句

4.1 for 语句格式:
        /*
        for (初始化表达式; 循环条件表达式; 循环后的操作表达式) {
                循环体;
        }
        */
        注意:
                (1) 结构: 2分号3表达式
                (2) 初始化表达式和循环后操作表达式可以有多个语句, 用逗号","分隔开来.
                (3) 循环条件表达式只能是一个 boolean 表达式, 其值要么为 true, 要么为 false
                        若不写循环条件表达式, 则默认为 true.
                        无限循环最简单表现形式: for (;;){} 或 while (true){}
                                或者 for (;;); 或 while (true);
                (4) ***执行流程(非常重要):
                                先执行1次"初始化表达式",
                                然后依次循环执行"循环条件表达式", "循环体", "循环后的操作表达式",
                                直到条件不满足为止.

4.2 for 语句和 while 语句比较
        能用 for 实现的循环用 while 也一定能实现, 但 for 和 while 有一点小区别:
        (1) for的循环变量可声明在for内,循环结束时循环变量被释放
                而 while 的循环变量必然声明在 while 外, 循环结束时循环变量不会被释放
                > 变量有自己的作用域.
                > 对于 for 来讲, 如果将用于控制循环的变量定义在 for 语句中,
                        那么循环变量只在 for 语句内有效. for 语句执行完毕,
                                其循环变量在内存中被释放.
                > 对于 while 来讲, 控制循环的变量必然定义在 while 语句外,
                        while 语句执行完毕后, 其循环变量不会被释放.
        (2) for 和 while 可以进行互换.

4.3 for 和 while 使用场合
        > 如果循环变量仅用于控制循环的次数时, 循环结束后不再使用, 用 for 循环更合.
        > 如果循环变量在循环结束后仍需要被使用, 用 while 循环更合适.

4.4 for 循环后的操作表达式
        break/return/throw 后都不执行 for 循环后表达式(因为没必要)
        continue 后执行 for 循环后表达式
                (因为可能还会执行下一次循环, 所以执行循环后表达式,
                        以便判断是否还执行下一次循环)
        p.s.:
                try 中的 break/continue/return/throw 后都执行 finally 中的语句
--------------------------------------------------------------------------------
5. break/continue/return/throw 语句

5.1 使用范围
        break 使用范围: switch 语句和循环语句
        continue 使用范围: 循环语句
        return 使用范围: 成员函数和构造器
        throw 使用范围: 局部位置, 如成员函数中/构造函数中/构造代码块中/静态代码块中

5.2 作用
        break 用于结束当前循环或跳出 switch 语句
        continue 用于结束本次循环, 继续下次循环
        return 用于结束成员函数, 并返回成员函数的运算结果
        throw 用于抛出异常, 若异常被 catch 则仅结束 try 中的代码;
                若异常未被 catch 则结束函数/构造器/构造代码块/静态代码块

5.3 注意事项
        > 这4个语句离开使用范围, 存在是没有意义的(编译错误)
        > 这4个语句单独存在时, 下面不可以有语句, 因为执行不到(编译错误)

5.4 break/continue 与标号
        (1) 标号只能用于循环上
        (2) 通过标号可以让 break/continue 作用于指定循环
        (3) 标号可以将 break/continue 作用的范围从最内部循环扩大到最外部循环.
--------------------------------------------------------------------------------




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2