流程控制
判断结构: 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 作用的范围从最内部循环扩大到最外部循环.
-------------------------------------------------------------------------------- |
|