|
|
@@ -0,0 +1,738 @@
|
|
|
+# JavaSE 基础 — Day03 笔记
|
|
|
+
|
|
|
+> **日期**:2026-07-15
|
|
|
+> **项目**:`c260715`
|
|
|
+> **作者**:WanJL
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、流程控制 — switch 分支语句
|
|
|
+
|
|
|
+### 1. switch 语句概述
|
|
|
+
|
|
|
+`switch` 语句和 `if` 不同,`if` 是**范围的匹配**,而 `switch` 是**针对某个具体值的匹配**。
|
|
|
+
|
|
|
+#### 基本语法格式
|
|
|
+
|
|
|
+```java
|
|
|
+switch (变量) {
|
|
|
+ case 常量1:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ case 常量2:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ case 常量n:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ 代码块;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**执行流程**:
|
|
|
+- 如果变量的值和 `case 常量1` 相等,就执行对应的代码块
|
|
|
+- 如果和 `case 常量n` 相等,就执行对应代码块
|
|
|
+- 如果都不相等,就执行 `default` 中的代码块
|
|
|
+- `break` 的作用:在执行完对应的代码块后,跳出整个 switch 结构,后面的代码不再执行
|
|
|
+
|
|
|
+#### 基本示例
|
|
|
+
|
|
|
+```java
|
|
|
+int a = 3;
|
|
|
+switch (a) {
|
|
|
+ case 1:
|
|
|
+ System.out.println("a=1");
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ System.out.println("a=2");
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ System.out.println("a=3");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ System.out.println("不知道");
|
|
|
+}
|
|
|
+// 输出:a=3
|
|
|
+```
|
|
|
+
|
|
|
+#### 课堂练习:星期转换
|
|
|
+
|
|
|
+定义一个变量(1~7),使用 switch 判断并分别输出 星期一 ~ 星期日。
|
|
|
+
|
|
|
+```java
|
|
|
+int b = 3;
|
|
|
+switch (b) {
|
|
|
+ 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("不知道");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2. 增强 switch(JDK 17~21)
|
|
|
+
|
|
|
+JDK 17~21 引入了增强的 switch 语句,支持:
|
|
|
+
|
|
|
+- **任何基本数据类型**、**字符串 String**、**枚举**
|
|
|
+- **箭头语法 `->`**:更简洁,自带 break 效果(不需要显式写 `break`)
|
|
|
+- **多值匹配**:一个 case 可以匹配多个值,用逗号分隔
|
|
|
+- **switch 表达式**:switch 可以直接返回一个值
|
|
|
+
|
|
|
+#### ① 箭头语法 + 多值匹配
|
|
|
+
|
|
|
+```java
|
|
|
+String day = "1";
|
|
|
+switch (day) {
|
|
|
+ case "1", "2", "3", "4", "5" -> System.out.println("工作日");
|
|
|
+ case "6", "7" -> System.out.println("休息日");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### ② 箭头语法 + 代码块(多条语句)
|
|
|
+
|
|
|
+```java
|
|
|
+switch (day) {
|
|
|
+ case "1" -> {
|
|
|
+ System.out.println("星期一");
|
|
|
+ System.out.println("周一");
|
|
|
+ System.out.println("天不错");
|
|
|
+ }
|
|
|
+ case "2" -> System.out.println("星期二");
|
|
|
+ case "3" -> System.out.println("星期三");
|
|
|
+ case "4" -> System.out.println("星期四");
|
|
|
+ case "5" -> System.out.println("星期五");
|
|
|
+ case "6" -> System.out.println("星期六");
|
|
|
+ case "7" -> System.out.println("星期日");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 如果箭头右侧有多条语句,需要使用 `{ }` 代码块包裹。
|
|
|
+
|
|
|
+#### ③ switch 表达式(返回一个值)
|
|
|
+
|
|
|
+switch 可以直接作为一个表达式使用,返回匹配到的值,可用于赋值等操作:
|
|
|
+
|
|
|
+```java
|
|
|
+String dd = "1";
|
|
|
+String s = switch (dd) {
|
|
|
+ case "1" -> "星期一";
|
|
|
+ case "2" -> "星期二";
|
|
|
+ case "3" -> "星期三";
|
|
|
+ case "4" -> "星期四";
|
|
|
+ case "5" -> "星期五";
|
|
|
+ case "6" -> "星期六";
|
|
|
+ case "7" -> "星期日";
|
|
|
+ default -> "不知道";
|
|
|
+};
|
|
|
+System.out.println("今天是" + s + ",天气真不错");
|
|
|
+// 输出:今天是星期一,天气真不错
|
|
|
+```
|
|
|
+
|
|
|
+> ⚠️ switch 表达式必须要有 `default` 分支,以确保所有可能值都有对应结果。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 3. 传统 switch vs 增强 switch 对比
|
|
|
+
|
|
|
+| 特性 | 传统 switch | 增强 switch(JDK 17+) |
|
|
|
+|------|-----------|----------------------|
|
|
|
+| **语法** | `case 值:` + `break;` | `case 值 ->` 箭头语法 |
|
|
|
+| **break** | 必须写,否则穿透 | 自带 break,无需写 |
|
|
|
+| **多值匹配** | 不支持(需写多个 case) | 支持:`case "1","2" ->` |
|
|
|
+| **返回值** | 不支持 | 支持:`switch(expr) { ... }` |
|
|
|
+| **穿透效果** | 有(可利用) | 无 |
|
|
|
+| **可读性** | 一般 | 更简洁清晰 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、流程控制 — 循环结构
|
|
|
+
|
|
|
+### 1. 循环概述
|
|
|
+
|
|
|
+**循环结构**:满足条件就不停地重复执行某段代码。
|
|
|
+
|
|
|
+Java 提供三种循环结构:
|
|
|
+| 循环类型 | 特点 |
|
|
|
+|---------|------|
|
|
|
+| **`for` 循环** | 先判断,后执行;适用于已知循环次数 |
|
|
|
+| **`while` 循环** | 先判断,后执行;适用于不确定循环次数 |
|
|
|
+| **`do...while` 循环** | 先执行,后判断;**循环体至少执行一次** |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 2. for 循环
|
|
|
+
|
|
|
+#### 语法格式
|
|
|
+
|
|
|
+```java
|
|
|
+for (初始化语句; 循环条件; 迭代语句) {
|
|
|
+ 循环体;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 执行步骤
|
|
|
+
|
|
|
+```
|
|
|
+第1步:执行初始化语句(如 int i = 0;)
|
|
|
+第2步:执行循环条件(如 i < 10;)
|
|
|
+ → 如果结果为 true,执行第3步
|
|
|
+ → 如果结果为 false,跳转到第5步(结束循环)
|
|
|
+第3步:执行循环体(如 System.out.println(i);)
|
|
|
+第4步:执行迭代语句(如 i++),然后跳转回第2步
|
|
|
+第5步:跳出循环,继续执行后面的代码
|
|
|
+```
|
|
|
+
|
|
|
+#### 示例:循环 1~100 之间的整数
|
|
|
+
|
|
|
+```java
|
|
|
+for (int i = 1; i <= 100; i++) {
|
|
|
+ System.out.println(i);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 3. while 循环
|
|
|
+
|
|
|
+#### 语法格式
|
|
|
+
|
|
|
+```java
|
|
|
+初始化语句;
|
|
|
+while (循环条件) {
|
|
|
+ 循环体;
|
|
|
+ 迭代语句;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 示例:循环 1~100 之间的整数
|
|
|
+
|
|
|
+```java
|
|
|
+int i = 1;
|
|
|
+while (i <= 100) {
|
|
|
+ System.out.println(i);
|
|
|
+ i++;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> ⚠️ **重要**:使用 `while` 或 `do...while` 时,**一定不要忘了写迭代语句(如 `i++`)**,否则会变成**死循环**(无限循环)。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 4. do...while 循环
|
|
|
+
|
|
|
+#### 语法格式
|
|
|
+
|
|
|
+```java
|
|
|
+初始化语句;
|
|
|
+do {
|
|
|
+ 循环体;
|
|
|
+ 迭代语句;
|
|
|
+} while (循环条件);
|
|
|
+```
|
|
|
+
|
|
|
+#### 示例:循环 1~100 之间的整数
|
|
|
+
|
|
|
+```java
|
|
|
+int i = 1;
|
|
|
+do {
|
|
|
+ System.out.println(i);
|
|
|
+ i++;
|
|
|
+} while (i <= 100);
|
|
|
+```
|
|
|
+
|
|
|
+#### 三种循环的核心区别
|
|
|
+
|
|
|
+| 特性 | `for` | `while` | `do...while` |
|
|
|
+|------|-------|---------|-------------|
|
|
|
+| **判断时机** | 先判断,后执行 | 先判断,后执行 | 先执行,后判断 |
|
|
|
+| **执行次数** | 0~n 次 | 0~n 次 | **至少 1 次** |
|
|
|
+| **适用场景** | 已知循环次数 | 不确定循环次数 | 至少需要执行一次 |
|
|
|
+| **初始化位置** | for 语句内部 | 循环外部 | 循环外部 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、课后作业讲解(7月14日作业)
|
|
|
+
|
|
|
+### 题目 1:判断闰年
|
|
|
+
|
|
|
+**知识点**:if-else、逻辑运算符(`&&`、`||`)、算术运算符(`%`)
|
|
|
+
|
|
|
+**闰年规则**(满足其一即可):
|
|
|
+1. 能被 4 整除但不能被 100 整除
|
|
|
+2. 能被 400 整除
|
|
|
+
|
|
|
+**代码实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title HomeWork05
|
|
|
+ * @description 7月14日课后作业-判断年份
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class HomeWork01 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int year = 2000;
|
|
|
+ // 判断是否闰年:能被4整除且不能被100整除,或者能被400整除
|
|
|
+ if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
|
|
|
+ System.out.println(year + "是闰年");
|
|
|
+ } else {
|
|
|
+ System.out.println(year + "是平年");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **核心逻辑**:`year % 4 == 0 && year % 100 != 0 || year % 400 == 0`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 2:三个数比大小
|
|
|
+
|
|
|
+**知识点**:三目运算符嵌套
|
|
|
+
|
|
|
+**代码实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title HomeWord02
|
|
|
+ * @description 7月14日课后作业-三个数比大小
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class HomeWork02 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int a = 10, b = 15, c = 20;
|
|
|
+ // 三目运算符嵌套:先比较 a 和 b,再将结果与 c 比较
|
|
|
+ System.out.println(a > b ? (a > c ? a : c) : (b > c ? b : c));
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **核心逻辑**:`a > b ? (a > c ? a : c) : (b > c ? b : c)`
|
|
|
+> - 先判断 `a > b` 是否成立
|
|
|
+> - 如果成立,再比较 `a` 和 `c`,取较大值
|
|
|
+> - 如果不成立,再比较 `b` 和 `c`,取较大值
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 4:水仙花数判定
|
|
|
+
|
|
|
+**知识点**:算术运算符(`/`、`%`)、if-else
|
|
|
+
|
|
|
+**水仙花数**:一个三位数,其各位数字的立方和等于该数本身。例如:`153 = 1³ + 5³ + 3³`
|
|
|
+
|
|
|
+**代码实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title HomeWork04
|
|
|
+ * @description 7月14日课后作业-水仙花数
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class HomeWork04 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int number = 153; // 定义一个整数变量
|
|
|
+ int bai = number / 100; // 百位
|
|
|
+ int shi = number / 10 % 10; // 十位
|
|
|
+ int ge = number % 10; // 个位
|
|
|
+ if (number == bai * bai * bai + shi * shi * shi + ge * ge * ge) {
|
|
|
+ System.out.println(number + "是水仙花数");
|
|
|
+ } else {
|
|
|
+ System.out.println(number + "不是水仙花数");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **取位技巧**:
|
|
|
+> - 百位:`number / 100`(整除去掉后两位)
|
|
|
+> - 十位:`number / 10 % 10`(先整除去掉个位,再取余去掉百位以上)
|
|
|
+> - 个位:`number % 10`(取余去掉前三位)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 5:简易计算器
|
|
|
+
|
|
|
+**知识点**:if-else if-else 多分支、算术运算符、除零判断
|
|
|
+
|
|
|
+**代码实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title HomeWork05
|
|
|
+ * @description 7月14日课后作业-简易计算器
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class HomeWork05 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int a = 15, b = 20;
|
|
|
+ char operator = '/';
|
|
|
+ if (operator == '+') {
|
|
|
+ System.out.println(a + b);
|
|
|
+ } else if (operator == '-') {
|
|
|
+ System.out.println(a - b);
|
|
|
+ } else if (operator == '*') {
|
|
|
+ System.out.println(a * b);
|
|
|
+ } else if (operator == '/') {
|
|
|
+ if (b == 0) {
|
|
|
+ System.out.println("除数不能为0");
|
|
|
+ } else {
|
|
|
+ System.out.println(a / b);
|
|
|
+ }
|
|
|
+ } else if (operator == '%') {
|
|
|
+ if (b == 0) {
|
|
|
+ System.out.println("除数不能为0");
|
|
|
+ } else {
|
|
|
+ System.out.println(a % b);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> ⚠️ **注意**:做除法和取模运算时,必须先判断除数是否为 0,避免 `ArithmeticException` 异常。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 7:数字加密系统
|
|
|
+
|
|
|
+**知识点**:算术运算符(`/`、`%`)、变量交换算法、综合运用
|
|
|
+
|
|
|
+**加密规则**:
|
|
|
+1. 获取 4 位数的每一位
|
|
|
+2. 每个数字加 5
|
|
|
+3. 对 10 取余
|
|
|
+4. 第 1 位与第 4 位互换,第 2 位与第 3 位互换
|
|
|
+
|
|
|
+**代码实现**:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title HomeWork07
|
|
|
+ * @description 7月14日课后作业-数字加密系统
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class HomeWork07 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int number = 1234;
|
|
|
+
|
|
|
+ // 加密规则-0:获取每个位的数
|
|
|
+ int qian = number / 1000; // 千位
|
|
|
+ int bai = number / 100 % 10; // 百位
|
|
|
+ int shi = number / 10 % 10; // 十位
|
|
|
+ int ge = number % 10; // 个位
|
|
|
+
|
|
|
+ // 加密规则-1:每个数字加 5
|
|
|
+ qian += 5;
|
|
|
+ bai += 5;
|
|
|
+ shi += 5;
|
|
|
+ ge += 5;
|
|
|
+
|
|
|
+ // 加密规则-2:对 10 取余
|
|
|
+ qian %= 10;
|
|
|
+ bai %= 10;
|
|
|
+ shi %= 10;
|
|
|
+ ge %= 10;
|
|
|
+
|
|
|
+ // 加密规则-3:第1位和第4位互换,第2位和第3位互换(使用加减法交换)
|
|
|
+ qian = qian + ge;
|
|
|
+ ge = qian - ge;
|
|
|
+ qian = qian - ge;
|
|
|
+
|
|
|
+ bai = bai + shi;
|
|
|
+ shi = bai - shi;
|
|
|
+ bai = bai - shi;
|
|
|
+
|
|
|
+ System.out.println("加密结果:" + qian + bai + shi + ge);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **变量交换技巧**(不借助第三个变量):
|
|
|
+> ```java
|
|
|
+> a = a + b; // a 变成两数和
|
|
|
+> b = a - b; // b 得到原 a 的值
|
|
|
+> a = a - b; // a 得到原 b 的值
|
|
|
+> ```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、知识拓展
|
|
|
+
|
|
|
+### 1. break 在 switch 中的作用
|
|
|
+
|
|
|
+在传统 switch 中,`break` 用于**跳出 switch 结构**,防止**穿透(fall-through)**。
|
|
|
+
|
|
|
+```java
|
|
|
+int n = 2;
|
|
|
+switch (n) {
|
|
|
+ case 1:
|
|
|
+ System.out.println("A");
|
|
|
+ // 没有 break → 会继续执行 case 2
|
|
|
+ case 2:
|
|
|
+ System.out.println("B");
|
|
|
+ break; // 跳出 switch
|
|
|
+ case 3:
|
|
|
+ System.out.println("C");
|
|
|
+}
|
|
|
+// 输出:B(case 1 不会匹配,case 2 匹配后输出 B 后跳出)
|
|
|
+```
|
|
|
+
|
|
|
+> 如果不写 `break`,匹配到某个 case 后,其后的所有 case 都会被执行,直到遇到 `break` 或 switch 结束。这个特性有时也会被**利用**(如多个 case 共享同一段代码)。
|
|
|
+
|
|
|
+### 2. 死循环
|
|
|
+
|
|
|
+循环条件永远为 `true` 的循环称为**死循环**(无限循环),应避免出现:
|
|
|
+
|
|
|
+```java
|
|
|
+// 死循环示例(不要运行!)
|
|
|
+while (true) {
|
|
|
+ System.out.println("无限循环");
|
|
|
+}
|
|
|
+
|
|
|
+// for 的死循环写法
|
|
|
+for (;;) {
|
|
|
+ System.out.println("无限循环");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 整数的进制表示
|
|
|
+
|
|
|
+Java 中整数可以使用不同进制表示:
|
|
|
+
|
|
|
+| 前缀 | 进制 | 示例 | 十进制值 |
|
|
|
+|------|------|------|---------|
|
|
|
+| `0b` 或 `0B` | 二进制 | `0b1100` | 12 |
|
|
|
+| `0` | 八进制 | `014` | 12 |
|
|
|
+| 无前缀 | 十进制 | `12` | 12 |
|
|
|
+| `0x` 或 `0X` | 十六进制 | `0xC` | 12 |
|
|
|
+
|
|
|
+```java
|
|
|
+int bin = 0b1100; // 二进制 → 12
|
|
|
+int oct = 014; // 八进制 → 12
|
|
|
+int dec = 12; // 十进制 → 12
|
|
|
+int hex = 0xC; // 十六进制 → 12
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、完整代码汇总
|
|
|
+
|
|
|
+### Demo01.java — switch 分支语句
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo01
|
|
|
+ * @description 流程控制-分支语句-switch
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo01 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ /*
|
|
|
+ switch语句和if不一样,不是范围的匹配,而是针对某个值的匹配,格式:
|
|
|
+ switch(变量){
|
|
|
+ case 常量1:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ case 常量2:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ case 常量n:
|
|
|
+ 代码块;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ 代码块;
|
|
|
+ }
|
|
|
+ */
|
|
|
+ // ===== 传统 switch =====
|
|
|
+ int a = 3;
|
|
|
+ switch (a) {
|
|
|
+ case 1:
|
|
|
+ System.out.println("a=1");
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ System.out.println("a=2");
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ System.out.println("a=3");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ System.out.println("不知道");
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== 练习题:星期转换 =====
|
|
|
+ int b = 3;
|
|
|
+ switch (b) {
|
|
|
+ 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("不知道");
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== 增强 switch:箭头语法 + 多值匹配 =====
|
|
|
+ String day = "1";
|
|
|
+ switch (day) {
|
|
|
+ case "1", "2", "3", "4", "5" -> System.out.println("工作日");
|
|
|
+ case "6", "7" -> System.out.println("休息日");
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== 增强 switch:箭头语法 + 代码块 =====
|
|
|
+ switch (day) {
|
|
|
+ case "1" -> {
|
|
|
+ System.out.println("星期一");
|
|
|
+ System.out.println("周一");
|
|
|
+ System.out.println("天不错");
|
|
|
+ }
|
|
|
+ case "2" -> System.out.println("星期二");
|
|
|
+ case "3" -> System.out.println("星期三");
|
|
|
+ case "4" -> System.out.println("星期四");
|
|
|
+ case "5" -> System.out.println("星期五");
|
|
|
+ case "6" -> System.out.println("星期六");
|
|
|
+ case "7" -> System.out.println("星期日");
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== switch 表达式(返回值) =====
|
|
|
+ String dd = "1";
|
|
|
+ String s = switch (dd) {
|
|
|
+ case "1" -> "星期一";
|
|
|
+ case "2" -> "星期二";
|
|
|
+ case "3" -> "星期三";
|
|
|
+ case "4" -> "星期四";
|
|
|
+ case "5" -> "星期五";
|
|
|
+ case "6" -> "星期六";
|
|
|
+ case "7" -> "星期日";
|
|
|
+ default -> "不知道";
|
|
|
+ };
|
|
|
+ System.out.println("今天是" + s + ",天气真不错");
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo02.java — 循环结构
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo02
|
|
|
+ * @description 流程控制-循环结构
|
|
|
+ * @create 2026/7/15
|
|
|
+ */
|
|
|
+public class Demo02 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ /*
|
|
|
+ 循环结构:满足条件就不停地循环执行代码
|
|
|
+ Java 三种循环结构:
|
|
|
+ for循环:
|
|
|
+ for(初始化语句; 循环条件; 迭代语句) {
|
|
|
+ 循环体;
|
|
|
+ }
|
|
|
+ 执行步骤:
|
|
|
+ 1. 执行初始化语句
|
|
|
+ 2. 执行循环条件(true 继续,false 退出)
|
|
|
+ 3. 执行循环体
|
|
|
+ 4. 执行迭代语句,跳回第2步
|
|
|
+
|
|
|
+ while循环:
|
|
|
+ 初始化语句;
|
|
|
+ while(循环条件) {
|
|
|
+ 循环体;
|
|
|
+ 迭代语句;
|
|
|
+ }
|
|
|
+
|
|
|
+ do...while循环:
|
|
|
+ 初始化语句;
|
|
|
+ do {
|
|
|
+ 循环体;
|
|
|
+ 迭代语句;
|
|
|
+ } while(循环条件);
|
|
|
+ do...while 至少执行一次循环体
|
|
|
+ */
|
|
|
+
|
|
|
+ // 练习:分别使用 for、while 和 do...while 循环 1~100 之间的整数
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、随堂练习要点
|
|
|
+
|
|
|
+1. **switch 基本语法**:`switch(变量) { case 常量: 代码块; break; ... default: }`
|
|
|
+2. **break 的作用**:跳出 switch 结构,防止穿透(fall-through)
|
|
|
+3. **传统 switch**:使用 `case 值:` + `break;` 语法
|
|
|
+4. **增强 switch(JDK 17+)**:使用 `case 值 ->` 箭头语法,自带 break
|
|
|
+5. **多值匹配**:`case "1", "2", "3" ->` 一个 case 匹配多个值
|
|
|
+6. **switch 表达式**:switch 可以直接作为表达式返回值,用于赋值
|
|
|
+7. **switch 表达式必须写 default**:确保所有可能值都有对应结果
|
|
|
+8. **循环结构**:重复执行某段代码,满足条件就继续循环
|
|
|
+9. **for 循环**:`for(初始化; 条件; 迭代) { 循环体 }`,先判断后执行
|
|
|
+10. **while 循环**:`while(条件) { 循环体; 迭代; }`,先判断后执行
|
|
|
+11. **do...while 循环**:`do { 循环体; 迭代; } while(条件);`,先执行后判断,至少执行一次
|
|
|
+12. **死循环**:循环条件永远为 true,应避免出现
|
|
|
+13. **迭代语句不能忘**:`while` 和 `do...while` 中必须写 `i++`,否则死循环
|
|
|
+14. **for vs while**:已知循环次数用 `for`,不确定次数用 `while`
|
|
|
+15. **do...while 特点**:无论条件是否满足,循环体至少执行一次
|
|
|
+16. **作业-闰年判断**:`year % 4 == 0 && year % 100 != 0 || year % 400 == 0`
|
|
|
+17. **作业-三数比大小**:`a > b ? (a > c ? a : c) : (b > c ? b : c)`
|
|
|
+18. **作业-水仙花数**:百位 `/100`、十位 `/10%10`、个位 `%10`
|
|
|
+19. **作业-计算器**:除法和取模前必须先判断除数是否为 0
|
|
|
+20. **作业-数字加密**:取每位 → 加5 → 取余10 → 位置互换
|
|
|
+21. **变量交换**:可使用加减法实现不借助第三变量的交换
|
|
|
+22. **进制表示**:`0b` 二进制、`0` 八进制、`0x` 十六进制
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 七、拓展阅读
|
|
|
+
|
|
|
+| 概念 | 说明 |
|
|
|
+|------|------|
|
|
|
+| **switch 穿透(fall-through)** | 传统 switch 中,匹配到某个 case 后若不写 break,会继续执行后续所有 case 的代码 |
|
|
|
+| **箭头 case `->`** | JDK 17+ 引入的增强 switch 语法,自带 break,右侧可以是表达式、代码块或 throw |
|
|
|
+| **switch 表达式** | switch 作为表达式使用,可以返回一个值,必须穷举所有可能或提供 default |
|
|
|
+| **循环(Loop)** | 重复执行某段代码的结构,有 for、while、do...while 三种 |
|
|
|
+| **死循环(Infinite Loop)** | 循环条件永远为 true,程序无法退出的循环,会导致程序卡死 |
|
|
|
+| **迭代(Iteration)** | 循环体每执行一次称为一次迭代 |
|
|
|
+| **初始化语句** | 循环开始前执行的语句,在 for 循环中只执行一次 |
|
|
|
+| **循环条件** | 布尔表达式,true 继续循环,false 退出循环 |
|
|
|
+| **迭代语句** | 每次循环结束后执行的语句,通常用于改变循环变量 |
|
|
|
+| **整除 `/` 与取余 `%`** | 常用于数字分解,如获取一个整数的各个位上的数字 |
|
|
|
+| **变量交换算法** | 不借助第三个变量,通过加减法或异或运算交换两个变量的值 |
|
|
|
+| **进制前缀** | `0b`(二进制)、`0`(八进制)、`0x`(十六进制) |
|