【Java】P5 Java流程控制——分支结构详解
目录
- 分支结构概述
- if-else 条件判断结构
- 基本语法格式
- 格式一:单一条件判断
- 格式二:二元条件判断
- 格式三:多重条件判断
- 实际应用示例
- 条件表达式设计原则
- if-else 的嵌套使用
- 嵌套结构的应用场景
- 嵌套使用的最佳实践
- Scanner类:实现键盘输入
- 使用步骤
- 完整示例
- 技术要点说明
- switch-case 选择结构
- 语法格式
- 核心特性与限制
- 实际应用示例
- Case穿透现象
- 使用注意事项
- 小结
在程序设计中,流程控制是构建逻辑清晰、功能完整的程序的基础。Java提供了三种基本的流程结构:顺序结构、分支结构和循环结构。在前述博文中,都是应用的顺序结构,从本博文开始,将深入探讨分支结构内容,并围绕两种主要形式:条件判断结构(if-else)和选择结构(switch-case),帮助开发者掌握程序流程控制的核心技能。
分支结构概述
分支结构允许程序根据特定条件选择不同的执行路径,这是实现程序逻辑判断的关键机制。Java中的分支结构主要包括:
- 条件判断结构:
if-else
语句,用于基于条件表达式的真假值进行分支选择 - 选择结构:
switch-case
语句,用于基于变量值与多个常量的匹配进行分支选择
if-else 条件判断结构
基本语法格式
格式一:单一条件判断
if (条件表达式) {// 条件为true时执行的语句块
}
格式二:二元条件判断
if (条件表达式) {// 条件为true时执行的语句块
} else {// 条件为false时执行的语句块
}
格式三:多重条件判断
if (条件表达式1) {// 条件1为true时执行
} else if (条件表达式2) {// 条件1为false且条件2为true时执行
} else {// 所有条件都为false时执行
}
实际应用示例
public class GradeEvaluation {public static void main(String[] args) {int score = 85;// 多重条件判断示例if (score >= 90) {System.out.println("优秀");} else if (score >= 80) {System.out.println("良好");} else if (score >= 70) {System.out.println("中等");} else if (score >= 60) {System.out.println("及格");} else {System.out.println("不及格");}}
}
条件表达式设计原则
在设计多重条件判断时,需要注意条件表达式的互斥性和优先级:
- 互斥关系: 确保条件之间相互排斥,避免逻辑冲突
- 顺序设置: 将更具体或优先级更高的条件放在前面
- 可选else: 根据业务需求决定是否需要else分支
// 推荐的条件设计
if (age < 18) {category = "未成年";
} else if (age < 60) {category = "成年人";
} else {category = "老年人";
}
if-else 的嵌套使用
嵌套结构的应用场景
嵌套的if-else结构适用于需要多层次判断的复杂逻辑场景。以下是一个三个数排序的实现示例:
public class NumberSorting {public static void main(String[] args) {int a = 15, b = 32, c = 8;if (a >= b) {if (a >= c) {// a最大if (b >= c) {System.out.println(a + " >= " + b + " >= " + c);} else {System.out.println(a + " >= " + c + " >= " + b);}} else {// c最大System.out.println(c + " >= " + a + " >= " + b);}} else {if (b >= c) {// b最大if (a >= c) {System.out.println(b + " >= " + a + " >= " + c);} else {System.out.println(b + " >= " + c + " >= " + a);}} else {// c最大System.out.println(c + " >= " + b + " >= " + a);}}}
}
嵌套使用的最佳实践
- 注意 - 控制嵌套层数: 从开发经验来看,嵌套层数不宜超过三层,以保持代码可读性
- 布尔值判断优化: 在开发中,一定要多注意一些细节的编写方法
// 不推荐if (isActive == true) { ... }// 推荐if (isActive) { ... }
- 考虑重构: 当嵌套过深时,考虑使用early return或提取方法来简化逻辑
Scanner类:实现键盘输入
在实际开发中,经常需要从用户获取输入数据。Java提供的 Scanner
类是处理控制台输入的标准工具。
使用步骤
- 导入包:
import java.util.Scanner;
- 创建实例:
Scanner input = new Scanner(System.in);
- 调用方法: 获取指定类型的数据
- 关闭资源:
scanner.close();
完整示例
import java.util.Scanner;public class UserInputExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入您的年龄: ");int age = scanner.nextInt();System.out.print("请输入您的姓名: ");String name = scanner.next();System.out.print("请输入您的身高(米): ");double height = scanner.nextDouble();System.out.print("是否为学生(true/false): ");boolean isStudent = scanner.nextBoolean();System.out.print("请输入等级(单个字符): ");char grade = scanner.next().charAt(0);// 输出收集到的信息System.out.println("\n===== 用户信息 =====");System.out.println("姓名: " + name);System.out.println("年龄: " + age);System.out.println("身高: " + height + "米");System.out.println("学生身份: " + (isStudent ? "是" : "否"));System.out.println("等级: " + grade);// 关闭资源,防止内存泄露scanner.close();}
}
技术要点说明
- 包导入: Java中除了
java.lang
包下的类,其他包中的类都需要显式导入 - 方法类型: Scanner提供多种类型的输入方法(
nextInt()
,nextDouble()
,nextBoolean()
等) - 字符获取: 通过
next().charAt(0)
获取单个字符 - 资源管理: 及时调用
close()
方法释放资源,避免内存泄露,因为垃圾回收器无法有效回收Scanner占用的系统资源
switch-case 选择结构
语法格式
switch (表达式) {case 常量1:// 执行语句1break;case 常量2:// 执行语句2break;case 常量3:// 执行语句3break;default:// 默认执行语句break;
}
核心特性与限制
- 支持的数据类型:
- 基本数据类型:
byte
,short
,char
,int
- 引用数据类型:枚举(
enum
)、字符串(String
,JDK 7+)
- 基本数据类型:
- 常量匹配: case后只能跟常量值,不能使用变量或表达式
- 相等判断: 只能进行相等性判断,无法进行范围比较
实际应用示例
public class WeekdayExample {public static void main(String[] args) {int dayOfWeek = 3;String dayName;switch (dayOfWeek) {case 1:dayName = "星期一";break;case 2:dayName = "星期二";break;case 3:dayName = "星期三";break;case 4:dayName = "星期四";break;case 5:dayName = "星期五";break;case 6:dayName = "星期六";break;case 7:dayName = "星期日";break;default:dayName = "无效的日期";break;}System.out.println("今天是:" + dayName);}
}
Case穿透现象
case穿透是switch-case结构的重要特性,当某个case分支没有break语句时,程序会继续执行后续的case分支。合理应用穿透现象,可以明显有效提高整体代码的简洁性与逻辑性:
public class CaseFallThroughExample {public static void main(String[] args) {int month = 2;switch (month) {case 12:case 1:case 2:System.out.println("冬季");break;case 3:case 4:case 5:System.out.println("春季");break;case 6:case 7:case 8:System.out.println("夏季");break;case 9:case 10:case 11:System.out.println("秋季");break;default:System.out.println("无效的月份");}}
}
使用注意事项
- break关键字: 用于跳出switch-case结构,防止case穿透
- default分支:
- 类似于if-else中的else分支
- 可选使用,位置灵活
- 建议放在最后以提高代码可读性
- 应用场景: 适合处理有限的、固定的选择情况
- 性能优势: 对于多分支选择,switch-case通常比多重if-else具有更好的性能
小结
分支结构是Java程序流程控制的重要组成部分。if-else
适合处理基于条件表达式的复杂逻辑判断,而 switch-case
更适合处理基于固定值匹配的多分支选择。在实际开发中,合理选择和使用这两种结构,结合Scanner类进行用户交互,可以构建出逻辑清晰、功能完善的程序。
掌握分支结构的使用技巧和最佳实践,是每个Java开发者必备的基础技能。通过不断的练习和应用,开发者可以编写出更加高效和可维护的代码。
2025.09 金融街