JAVA基础——程序流程控制(分支结构)
JAVA基础——程序流程控制(分支结构)
一、程序流程控制概述
程序的执行顺序分为三种结构:
- 顺序结构:代码自上而下逐行执行(默认结构)。
System.out.println("A"); // 先执行 System.out.println("B"); // 再执行
- 分支结构:根据条件判断结果选择执行不同代码块。
- 关键词:
if
、switch
。
- 关键词:
- 循环结构:重复执行某段代码(后续章节详细讲解)。
二、分支结构 - if语句
2.1 if语句的三种形式
2.1.1 单分支结构(if)
- 格式:
if (条件表达式) {// 条件为true时执行的代码 }
- 执行流程:
先判断条件表达式,若为true
则执行大括号内代码,否则跳过。 - 注意事项:
- 条件表达式必须是布尔值(
true
/false
)。 - 若大括号内只有一行代码,可省略大括号,但不建议省略(增强可读性)。
- 条件表达式必须是布尔值(
- 示例:
int score = 59; if (score >= 60) {System.out.println("成绩及格"); } // 输出:无(条件为false,跳过)
2.1.2 双分支结构(if-else)
- 格式:
if (条件表达式) {// 条件为true时执行 } else {// 条件为false时执行 }
- 执行流程:
条件为true
执行if
块,否则执行else
块,二者必选其一。 - 示例:
int age = 17; if (age >= 18) {System.out.println("成年"); } else {System.out.println("未成年"); // 输出:未成年 }
2.1.3 多分支结构(if-else if-else)
- 格式:
if (条件1) {// 条件1为true时执行 } else if (条件2) {// 条件2为true时执行 } else {// 所有条件都为false时执行 }
- 执行流程:
按顺序判断条件,遇到第一个true
的条件执行对应代码块,后续条件不再判断;若全为false
,执行else
块(可选)。 - 示例:
int temp = 25; if (temp < 0) {System.out.println("穿大衣"); } else if (temp < 10) {System.out.println("穿毛衣"); } else if (temp < 20) {System.out.println("穿T恤"); } else if (temp < 30) {System.out.println("穿短裤"); // 输出:穿短裤 } else {System.out.println("穿短裙"); }
2.2 if语句的注意事项
- 条件表达式:
- 只能是布尔值,不能用赋值表达式(如
if (a=5)
是错误的,应为if (a==5)
)。
- 只能是布尔值,不能用赋值表达式(如
- 大括号规范:
- 即使只有一行代码,也建议保留大括号,避免逻辑错误。
- 嵌套使用:
- if语句中可嵌套其他if语句,用于复杂条件判断。
int score = 85; String level; if (score >= 60) {if (score >= 80) {level = "优秀"; // score >= 80时执行} else {level = "及格";} } else {level = "不及格"; }
- if语句中可嵌套其他if语句,用于复杂条件判断。
三、分支结构 - switch语句
3.1 switch语句的格式与执行流程
- 格式:
switch (表达式) {case 值1:// 代码块1break;case 值2:// 代码块2break;...default:// 所有case都不匹配时执行break; }
- 执行流程:
- 计算表达式的值。
- 依次与每个
case
后的值比较,匹配成功则执行对应代码块,遇到break
跳出switch。 - 所有
case
都不匹配时,执行default
块(可选)。
3.2 关键细节
- 表达式类型:
- 支持
byte
、short
、int
、char
、String
(JDK7+)、枚举(JDK5+)。 - 不支持:
long
、float
、double
等。
- 支持
- case值要求:
- 必须是字面量(如
10
、'A'
、"abc"
),不能是变量。 - 值必须唯一,不能重复。
- 必须是字面量(如
- break的作用:
- 必须手动添加,否则会发生穿透现象(执行当前case后,继续执行后续所有case,直到遇到break或switch结束)。
int day = 2; switch (day) {case 1:System.out.println("周一");case 2:System.out.println("周二"); // 穿透!case 3:System.out.println("周三"); // 输出:周二、周三(无break)break;default:System.out.println("其他"); }
- 必须手动添加,否则会发生穿透现象(执行当前case后,继续执行后续所有case,直到遇到break或switch结束)。
- default的位置:
- 可放在任意位置,但建议放在最后,逻辑更清晰。
3.3 switch与if的对比
场景 | if | switch |
---|---|---|
条件类型 | 支持区间判断(如a>10 ) | 支持等值判断(如a==10 ) |
代码可读性 | 区间判断更直观 | 等值判断更简洁 |
性能 | 条件多时效率可能下降 | 效率稳定(哈希表优化) |
适用场景 | 天气温度、考试等级等区间判断 | 菜单选项、月份、星期等等值判断 |
示例:菜单选择(switch更合适)
int choice = 2;
switch (choice) {case 1:System.out.println("查看余额");break;case 2:System.out.println("转账"); // 输出:转账break;case 3:System.out.println("退出");break;default:System.out.println("无效选择");
}
四、分支结构的应用场景
4.1 if语句典型场景
- 区间判断:如成绩等级、温度区间、年龄分段等。
// BMI健康评估 double bmi = 22.5; if (bmi < 18.5) {System.out.println("体重过低"); } else if (bmi < 24.9) {System.out.println("正常"); // 输出:正常 } else {System.out.println("超重"); }
4.2 switch语句典型场景
- 等值判断:如用户输入选项、枚举类型处理、协议类型匹配等。
// 交通信号灯控制(枚举示例) enum TrafficLight { RED, YELLOW, GREEN } TrafficLight light = TrafficLight.GREEN; switch (light) {case RED:System.out.println("停车");break;case YELLOW:System.out.println("准备");break;case GREEN:System.out.println("通行"); // 输出:通行break; }
五、分支结构常见错误与注意事项
- if条件误用:
- 错误:
if (a = 5)
(应为if (a == 5)
)。 - 原因:赋值表达式
a=5
的结果是int
类型,而非布尔值。
- 错误:
- switch穿透忘记break:
- 后果:导致多个case被执行,逻辑混乱。
- 解决:每个case后必须添加
break
(除非故意利用穿透特性简化代码)。
- switch表达式类型不匹配:
- 错误:
switch (longNum)
(long类型不支持)。 - 解决:改用
if-else
或转换为支持的类型(如int
)。
- 错误:
六、总结
分支结构 | 格式特点 | 适用场景 |
---|---|---|
if | 支持单分支、双分支、多分支,条件可为区间或等值判断 | 区间判断、复杂逻辑 |
switch | 等值判断,表达式类型有限,需手动添加break避免穿透 | 等值枚举、固定选项 |
选择建议:
- 区间判断或条件复杂时用
if
。 - 等值判断且条件明确时用
switch
,代码更简洁优雅。