【Java基础|Day03】流程控制语句
文章目录
- 今日学习目标
- 第一部分:控制流程概述
- 第二部分:分支结构详解
-
- 2.1 if 语句
-
- 2.1.1 基本格式与执行流程:
- 2.1.2 重要注意事项:
- 2.2 switch语句
-
- 2.2.1 基本格式与执行流程:
- 2.2.2 重要注意事项:
- 2.3 分支结构对比
- 第三部分:循环结构详解
-
- 3.1 for循环
- 3.2 while循环
- 3.3 do..while循环
- 3.4 循环结构对比
今日学习目标
- 理解程序控制流程的三种基本结构:顺序、分支和循环
- 掌握if语句的三种格式及其执行流程
- 掌握switch语句的格式与执行流程,理解case穿透及其应用
- 掌握for循环的格式与执行流程
- 掌握while循环的格式与执行流程
- 掌握do-while循环的格式与执行流程
- 能够根据实际需求选择合适的控制结构(分支或循环)来解决问题。
第一部分:控制流程概述
程序控制流程分为三大类:
| 结构类型 | 描述 | Java语法 | 适用场景 |
|---|---|---|---|
| 顺序结构 | 默认执行流程,代码按编写顺序自上而下依次执行 | 无特殊语法 | 所有程序的基础流程 |
| 分支结构 | 根据不同条件选择执行不同代码块 | if, switch | 条件判断、多路选择 |
| 循环结构 | 重复执行特定代码块直到条件不满足 | for, while, do-while | 重复操作、遍历数据 |
第二部分:分支结构详解
2.1 if 语句
2.1.1 基本格式与执行流程:
格式一:单分支结构—如果条件成立就执行代码语句
if(关系表达式){
语句体;
}
执行流程:
- 先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体
- 如果关系表达式的值为false就不执行语句体
- 继续执行后续代码
是
否
开始
条件为真?
执行代码块
后续代码
格式二:双分支结构—如果条件成立就执行代码语句1,否则就执行代码语句2
if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
- 先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体1
- 如果关系表达式的值为false就执行语句体2
- 继续执行后续代码
是
否
开始
条件为真?
语句体1
后续代码
语句体2
格式三:多分支结构—存在多种不同情况执行对应情况的语句体
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}
...
else{
语句体;
}
执行流程:
- 先计算关系表达式1的值
- 如果关系表达式1的值为true就执行语句体1,如果为false就计算关系表达式2的值
- 如果关系表达式2的值为true就执行语句体2,如果为false就计算关系表达式3的值
- …
- 如果所有关系表达式结果都为false,就执行else后的语句
- 继续执行后续代码
是
否
是
否
是
否
开始
条件1?
块1
条件2?
块2
…
条件n?
块n
else块
后续代码
2.1.2 重要注意事项:
- 布尔变量的简洁写法:对于一个布尔量,尽量不要用" == "来判断,直接写在括号中即可
public class Day03 {
public static void main(String[] args) {
boolean b = 10>3;
if(b) { // 而不是b==true
System.out.println("hello world");
}
}
}
- 执行顺序特性:if 结构中,条件判断从上到下进行,一旦某个条件满足,执行对应代码块后立即退出,不再检查后续条件。
public class Day03 {
public static void main(String[] args) {
int a = 10;
if(a>0){
System.out.println("a>0"); //输出:a>0
}else if(a>5){// 不再检查此条件
System.out.println("a>5");
}
}
}
- 代码规范建议:
- 只有一行代码时,我们可以省略花括号的书写,但是我们一般建议不要省略
- 左大括号放在行尾,右大括号单独一行
- else 子句是可选的,当不需要处理所有条件都不满足的情况时,可以省略。
2.2 switch语句
2.2.1 基本格式与执行流程:
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n;
break;
}
执行流程:
- 先计算表达式的值
- 依次和case后面的值比较,如果有对应值,就会执行相应语句,在执行过程中如果有break就会结束
- 如果所有case后面的值与表达式的值都不匹配,就会执行default里面的语句,然后结束整个switch语句
是
否
是
否
是
否
开始
计算表达式值
匹配 case 值1?
执行语句体1
执行 break
结束switch
匹配 case 值2?
执行语句体2
执行 break
匹配其他case?
执行对应语句体
执行 break
执行 default 语句体n
执行 break
后续代码
2.2.2 重要注意事项:
- 格式语法说明:
| 组成部分 | 说明 | 注意事项 |
|---|---|---|
| 表达式 | 任何能计算出确定值的代码片段 | 类型限制:byte、short、int、char、枚举(JDK5+)、String(JDK7+) |
| case | 与表达式比较的值 | 不能重复,不能使用变量 |
| break | 中断switch语句,阻止case穿透 | 可选,但通常需要。省略会导致case穿透 |
| default | 所有case都不匹配时执行 | 可省略,可以放在任意位置,建议放在最后 |
一些表达式示例:
// 简单变量
int score = 85;
switch (score) { ... }
// 运算表达式
switch (score * 2 + 10) { ... }
// 方法调用(方法必须返回有效类型)
int getScore() { return 85; }
switch (getScore()) { ... }
// 三元表达式
switch (score >= 60 ? 1 : 0) { ... }
- case的穿透性:
- 什么是case的穿透性?
当某个 case 匹配成功后,如果没有遇到 break,程序会继续执行后续 case 的代码块,而不管这些 case 的条件是否匹配,直到遇到break或switch结束。 - 穿透应用场景:多个case的语句体重复了,可以使用case穿透简化代码。
public class Day03 {
public static void main(String[] args) {
int day = 1;
switch (day) {
case 1:
System.out.println("工作日");
break;
case 2:
System.out.println("工作日");
break;
case 3:
System.out.println("工作日");
break;
case 4:
System.out.println("工作日");
break;
case 5:
System.out.println("工作日");
break;
case 6:
System.out.println("休息日");
break;
case 7:
System.out.println("休息日");
break;
default:
System.out.println("输入错误");
break;
}
// 利用case的穿透性简化:
switch(day){
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("工作日");
break;
case 6:
case 7:
System.out.println("休息日");
break;
default:
System.out.println("输入错误");
break;
}
// 还可以进一步简化:
switch(day){
case 1, 2, 3, 4, 5:
System.out.println("工作日");
break;
case 6,7:
System.out.println("休息日");
break;
default:
System.out.println("输入错误");
break;
}
// JDK 12+ 箭头语法:(自动break,不需要写break)
switch(day) {
case 1, 2, 3, 4, 5 -> {
System.out.println("工作日");
}
case 6, 7 -> {
System.out.println("休息日");
}
default -> {
System.out.println("输入错误");
}
}
}
- 跳转控制语句:
| 语句 | 在switch中的作用 | 在循环中的作用 |
|---|---|---|
| break | 结束整个switch语句 | 结束整个循环 |
| continue | 不可用 | 跳过本次循环剩余代码,继续下一次循环 |
2.3 分支结构对比
| 特性 | if语句 | switch语句 |
|---|---|---|
| 判断类型 | 条件表达式 | 等值比较 |
| 适用场景 | 1. 条件为范围 2. 条件为布尔表达式 3. 条件数量较少或不确定 |
1. 基于单个变量的多个固定值 2. 枚举类型选择 3. 字符串常量匹配 |
总结建议:
- 使用if语句:适合条件判断涉及范围、布尔逻辑、复杂条件
- 使用switch语句:适合基于单个变量与多个固定值进行等值匹配
第三部分:循环结构详解
3.1 for循环
格式:
for(初始化语句;条件表达式;条件控制语句){
循环体;
}
执行流程:
- 执行初始化语句
- 执行条件表达式,如果是true,执行循环体;如果是false,结束循环
- 执行条件控制语句
- 再执行2
是
否
开始循环
执行初始化语句
条件表达式
是否为真?
执行循环体
执行条件控制语句
结束循环
继续后续代码
3.2 while循环
格式:
初始化语句 ;
while(条件表达式){
循环体 ;
条件控制语句 ;
}
执行流程:
- 执行初始化语句
- 执行条件表达式,如果是true,执行循环体;如果是false,结束循环
- 执行条件控制语句
- 再执行2
是
否
开始循环
执行初始化语句
条件表达式
是否为真?
执行循环体
执行条件控制语句
结束循环
继续后续代码
3.3 do…while循环
格式:
初始化语句 ;
do{
循环体 ;
条件控制语句 ;
}while(条件表达式);
执行流程:
- 执行初始化语句
- 执行循环体语句
- 执行条件控制语句
- 执行条件表达式判断,如果为 true,回到第 2 步继续执行;如果为 false,结束循环
- 继续执行后续代码
是
否
开始循环
执行初始化语句
执行循环体语句
执行条件控制语句
条件表达式
是否为真?
结束循环
继续后续代码
3.4 循环结构对比
do…while:无论如何都会无条件执行一次循环体,再开始进行判断是否继续循环。
for和while流程一致,有何区别?
for循环一般用于已知的循环次数或者循环范围的场景
while循环一般用于已知的开始结束循环条件的场景,而不知道循环次数。
| 特性 | for循环 | while循环 | do-while循环 |
|---|---|---|---|
| 执行次数 | 0次或多次 | 0次或多次 | 至少1次 |
| 适用场景 | 循环次数或者循环范围已知 | 循环次数未知,知道开始结束循环的条件 | 需要至少执行一次的场景 |
以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。
© 版权声明
文章版权归作者所有,未经允许请勿转载。