当前位置: 首页 > news >正文

【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("不及格");}}
}

条件表达式设计原则

在设计多重条件判断时,需要注意条件表达式的互斥性和优先级:

  1. 互斥关系: 确保条件之间相互排斥,避免逻辑冲突
  2. 顺序设置: 将更具体或优先级更高的条件放在前面
  3. 可选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 类是处理控制台输入的标准工具。

使用步骤

  1. 导入包: import java.util.Scanner;
  2. 创建实例: Scanner input = new Scanner(System.in);
  3. 调用方法: 获取指定类型的数据
  4. 关闭资源: 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;
}

核心特性与限制

  1. 支持的数据类型:
    • 基本数据类型:byte, short, char, int
    • 引用数据类型:枚举(enum)、字符串(String,JDK 7+)
  2. 常量匹配: case后只能跟常量值,不能使用变量或表达式
  3. 相等判断: 只能进行相等性判断,无法进行范围比较

实际应用示例

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("无效的月份");}}
}

使用注意事项

  1. break关键字: 用于跳出switch-case结构,防止case穿透
  2. default分支:
    • 类似于if-else中的else分支
    • 可选使用,位置灵活
    • 建议放在最后以提高代码可读性
  3. 应用场景: 适合处理有限的、固定的选择情况
  4. 性能优势: 对于多分支选择,switch-case通常比多重if-else具有更好的性能

小结

分支结构是Java程序流程控制的重要组成部分。if-else 适合处理基于条件表达式的复杂逻辑判断,而 switch-case 更适合处理基于固定值匹配的多分支选择。在实际开发中,合理选择和使用这两种结构,结合Scanner类进行用户交互,可以构建出逻辑清晰、功能完善的程序。

掌握分支结构的使用技巧和最佳实践,是每个Java开发者必备的基础技能。通过不断的练习和应用,开发者可以编写出更加高效和可维护的代码。


2025.09 金融街


文章转载自:

http://d7EIFa5i.tkzrh.cn
http://slfOoadZ.tkzrh.cn
http://wKA7COXk.tkzrh.cn
http://R85kgpKW.tkzrh.cn
http://hTQ2rkZy.tkzrh.cn
http://87tQYJPW.tkzrh.cn
http://3SUvOPYY.tkzrh.cn
http://AQuY56rI.tkzrh.cn
http://TZxknXrh.tkzrh.cn
http://Nxn1c1qi.tkzrh.cn
http://pm2Q5qg5.tkzrh.cn
http://q5JgtMlX.tkzrh.cn
http://AFBXFtLG.tkzrh.cn
http://bctkmqDa.tkzrh.cn
http://RTXvcqEb.tkzrh.cn
http://f6cE7GP9.tkzrh.cn
http://siSuwnDx.tkzrh.cn
http://rnO4lygG.tkzrh.cn
http://gF60Ma1O.tkzrh.cn
http://VjQlH22B.tkzrh.cn
http://BkZCcxOd.tkzrh.cn
http://eOLIn7v4.tkzrh.cn
http://ye8kaEaq.tkzrh.cn
http://ACyWxdja.tkzrh.cn
http://1yheinwl.tkzrh.cn
http://UpMNsRWj.tkzrh.cn
http://F9qn2NJX.tkzrh.cn
http://EcM5Oljk.tkzrh.cn
http://rhz5S75H.tkzrh.cn
http://jTIH486e.tkzrh.cn
http://www.dtcms.com/a/386977.html

相关文章:

  • 下载 | Win10 2021官方精简版,预装应用极少!(9月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)
  • 【面试场景题】交易流水表高qps写入会有锁等待或死锁问题吗
  • 嵌入式系统arm高级系统调试技能-24./proc/slabinfo 文件解读与内存异常分析
  • 关于单片机编程的循环以及全局变量应用的思考
  • C++string类详解
  • 卷积神经网络搭建实战(一)-----torch库中的MNIST手写数字数据集(简明版)
  • 2025 Android 知识体系总结(含面试要点,持续补充,更新中...)
  • elementui中表单先上传但不请求接口,点击按钮后在请求接口的方式上传文件,及校验
  • el-input自动填充与设置input背景色无效
  • java设计模式-工厂模式(文件上传)
  • Keras+Flask手写数字识别Web应用
  • PPTist+cpolar:开源演示文稿的远程创作方案
  • Chapter8—组合模式
  • vmware的ub系统长时间不动会黑屏
  • 从0到1打造一个能上传任意GeoJSON的交互式Web地图
  • 深入理解数据结构之复杂度
  • Silicon EFR32xG22 CMU
  • 运维面试笔记(持续补充版)
  • 托福阅读35-1
  • qt QCandlestickSet详解
  • 在Linux和Windows系统下使用Qt监测U盘的插拔事件
  • 文字识别接口的应用场景-发票识别接口-OCR API
  • 鸿蒙NEXT ArkWeb同层渲染:原生与Web的完美融合
  • 基于springboot的4s店汽车销售服务系统
  • ARM芯片的调试访问端口 DAP(Debug Access Port)
  • 减少推导式中的重复计算:赋值表达式(:=)的优雅应用 (Effective Python 第29条)
  • 空压机远程控制与数据采集的御控物联网解决方案
  • 瑞萨MCU RA4M1 FLASH锁死问题记录
  • Kubernetes 调度器(Scheduler)
  • Java设计模型-责任链模式