|
|
@@ -0,0 +1,326 @@
|
|
|
+# JavaSE 基础 — Day05 笔记
|
|
|
+
|
|
|
+> **日期**:2026-07-17
|
|
|
+> **项目**:`c260717`
|
|
|
+> **作者**:WanJL
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、Java 方法(Method)
|
|
|
+
|
|
|
+### 1. 方法概述
|
|
|
+
|
|
|
+**方法(Method)** 在 Java 中称为方法,在 C/C++ 中称为函数。它们是给一段代码取名字,以后通过这个名字来调用这段代码。
|
|
|
+
|
|
|
+> **作用**:让代码可以复用,分解整个程序的复杂度,方便测试和调试。
|
|
|
+
|
|
|
+### 2. 方法的四种声明方式
|
|
|
+
|
|
|
+方法按照 **是否具有返回值** 和 **是否具有参数** 可以分为 4 种声明方式:
|
|
|
+
|
|
|
+#### 第 1 种:既没有参数、也没有返回值
|
|
|
+
|
|
|
+```java
|
|
|
+public static void 方法名() {
|
|
|
+ // 方法体:封装的代码
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+- `public static`:修饰符(后续详细讲解)
|
|
|
+- `void`:当方法没有设置返回值类型时,需要使用 `void` 占位
|
|
|
+- `方法名`:调用时使用方法名调用
|
|
|
+- `()`:标识这是一个方法,并且可以定义参数
|
|
|
+
|
|
|
+**示例**:计算用户输入的两个整数,累加后输出
|
|
|
+
|
|
|
+```java
|
|
|
+public static void add() {
|
|
|
+ Scanner sc = new Scanner(System.in);
|
|
|
+ System.out.println("请输入第1个数:");
|
|
|
+ int n1 = sc.nextInt();
|
|
|
+ System.out.println("请输入第2个数:");
|
|
|
+ int n2 = sc.nextInt();
|
|
|
+ int sum = n1 + n2;
|
|
|
+ System.out.println("计算结果为:" + sum);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+调用方式:`add();`
|
|
|
+
|
|
|
+#### 第 2 种:有方法参数,但是没有方法返回值
|
|
|
+
|
|
|
+```java
|
|
|
+public static void 方法名(参数类型1 参数名1, 参数类型2 参数名2, ..., 参数类型n 参数名n) {
|
|
|
+ // 方法体
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**示例**:计算两个整数相加并输出
|
|
|
+
|
|
|
+```java
|
|
|
+public static void add(int a, int b) {
|
|
|
+ int sum = a + b;
|
|
|
+ System.out.println(sum);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+调用方式:`add(15, 7);` — 传入实际参数值
|
|
|
+
|
|
|
+#### 第 3 种 & 第 4 种(预告)
|
|
|
+
|
|
|
+后续课程将补充有返回值的方法声明方式。
|
|
|
+
|
|
|
+### 3. main 方法调用示例
|
|
|
+
|
|
|
+```java
|
|
|
+public static void main(String[] args) {
|
|
|
+ // 调用有参数的方法
|
|
|
+ add(15, 7);
|
|
|
+ add(8, 25);
|
|
|
+ add(7, 76);
|
|
|
+ add(9, 23);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 4. 方法练习
|
|
|
+
|
|
|
+> 以下为课堂练习,可使用上述方法知识实现:
|
|
|
+
|
|
|
+1. 声明一个计算 2 个整数相减的方法,定义参数 a 和 b —— 没有返回值、有参数的方法
|
|
|
+2. 声明一个循环输出 1~100 的整数的方法并调用 —— 没有返回值、没有参数的方法
|
|
|
+3. 声明一个获取三个变量中最大值的方法,调用方法传入 3 个参数,会输出最大值
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、课后作业 —— 三种排序算法复习
|
|
|
+
|
|
|
+> 本日作业巩固了 7 月 16 日学习的三种排序算法。
|
|
|
+
|
|
|
+### 作业 1:冒泡排序(HomeWork01)
|
|
|
+
|
|
|
+```java
|
|
|
+// 冒泡排序 — 优化版本(带提前结束标记)
|
|
|
+int[] arr = {29, 10, 14, 37, 13, 33, 48, 22};
|
|
|
+
|
|
|
+// arr.length - 1 是比较的轮数
|
|
|
+for (int i = 0; i < arr.length - 1; i++) {
|
|
|
+ boolean b = false; // 标记是否出现提前排完序的情况
|
|
|
+
|
|
|
+ for (int j = 0; j < arr.length - 1 - i; j++) {
|
|
|
+ if (arr[j] > arr[j + 1]) {
|
|
|
+ // 通过加减法交换两数(不使用临时变量)
|
|
|
+ arr[j] = arr[j] + arr[j + 1];
|
|
|
+ arr[j + 1] = arr[j] - arr[j + 1];
|
|
|
+ arr[j] = arr[j] - arr[j + 1];
|
|
|
+ b = true; // 标记本轮有交换,说明还没排完序
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果 b == false,说明已经排序完成,提前跳出循环
|
|
|
+ if (!b) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 冒泡排序核心思想
|
|
|
+
|
|
|
+| 项目 | 说明 |
|
|
|
+|------|------|
|
|
|
+| 排序方式 | 比较相邻元素的大小,较大的交换位置 |
|
|
|
+| 最多轮数 | 长度 - 1 轮 |
|
|
|
+| 每轮比较次数 | 逐次减少,最长 - 1 次 |
|
|
|
+| 优化手段 | 通过 `boolean` 标记判断是否提前完成排序 |
|
|
|
+| 交换技巧 | 使用加减法交换两数,无需临时变量 |
|
|
|
+
|
|
|
+### 作业 2:选择排序 — 降序(HomeWork02)
|
|
|
+
|
|
|
+> 选择排序:选出来最小的元素,和第 1 个元素进行交换。每一轮外层循环只交换 1 次。
|
|
|
+
|
|
|
+```java
|
|
|
+// 选择排序(降序)— 选最大的
|
|
|
+int[] arr = {56, 23, 89, 12, 45, 67, 34, 78};
|
|
|
+
|
|
|
+// 外层循环,i 既是已排序区间的末尾边界,也是当前要确定的位置
|
|
|
+for (int i = 0; i < arr.length - 1; i++) {
|
|
|
+ // 假设当前未排序区间的第 1 个元素是最大的
|
|
|
+ int maxIndex = i;
|
|
|
+
|
|
|
+ // 通过一轮循环,选出最大元素的索引值
|
|
|
+ for (int j = i + 1; j < arr.length; j++) {
|
|
|
+ if (arr[j] > arr[maxIndex]) {
|
|
|
+ maxIndex = j;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果最大值不在 i 的位置,则交换
|
|
|
+ if (maxIndex != i) {
|
|
|
+ arr[maxIndex] = arr[maxIndex] + arr[i];
|
|
|
+ arr[i] = arr[maxIndex] - arr[i];
|
|
|
+ arr[maxIndex] = arr[maxIndex] - arr[i];
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 选择排序核心思想
|
|
|
+
|
|
|
+| 项目 | 说明 |
|
|
|
+|------|------|
|
|
|
+| 排序方式 | 每轮选出最大(或最小)元素,与当前位置交换 |
|
|
|
+| 交换次数 | 每轮最多交换 1 次 |
|
|
|
+| 降序实现 | 每轮选出最大值放到前面 |
|
|
|
+| 交换条件 | 仅当 `maxIndex != i` 时才交换 |
|
|
|
+
|
|
|
+### 作业 3:插入排序 — 升序(HomeWork03)
|
|
|
+
|
|
|
+> 把一个数组分为两部分:已排序部分和未排序部分。从未排序部分取出第 1 个元素,与已排序部分从最后一个元素开始比较,直到找到比这个元素小的元素,放到它后面。
|
|
|
+
|
|
|
+```java
|
|
|
+// 插入排序(升序)
|
|
|
+int[] studentScores = {88, 72, 93, 65, 81, 97, 78, 85};
|
|
|
+
|
|
|
+// 从第 2 个元素开始(假设第 1 个元素是已排序部分)
|
|
|
+for (int i = 1; i < studentScores.length; i++) {
|
|
|
+ // 当前要插入的元素
|
|
|
+ int current = studentScores[i];
|
|
|
+ // 已排序部分的最后一个元素的索引
|
|
|
+ int j = i - 1;
|
|
|
+
|
|
|
+ // 从后往前扫描已排序部分,寻找插入位置
|
|
|
+ while (j >= 0 && studentScores[j] > current) {
|
|
|
+ studentScores[j + 1] = studentScores[j]; // 往后移动一位
|
|
|
+ j--;
|
|
|
+ }
|
|
|
+
|
|
|
+ // j + 1 就是 current 应该插入的位置
|
|
|
+ studentScores[j + 1] = current;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 插入排序核心思想
|
|
|
+
|
|
|
+| 项目 | 说明 |
|
|
|
+|------|------|
|
|
|
+| 排序方式 | 将数组分为已排序和未排序两部分 |
|
|
|
+| 起始状态 | `studentScores[0]` 为已排序部分 |
|
|
|
+| 插入方式 | 从后往前扫描已排序部分,找到合适位置插入 |
|
|
|
+| 移动方式 | 比当前元素大的元素均向后移动一位 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、课后作业 —— Scanner 学生信息采集系统(HomeWork04)
|
|
|
+
|
|
|
+> 使用 `Scanner` 键盘输入,采集学生信息并计算 BMI 指数。
|
|
|
+
|
|
|
+### 信息采集表
|
|
|
+
|
|
|
+| 信息项 | 数据类型 | 提示语 |
|
|
|
+|--------|----------|--------|
|
|
|
+| 姓名 | `String` | `请输入您的姓名:` |
|
|
|
+| 学号 | `String` | `请输入您的学号:` |
|
|
|
+| 年龄 | `int` | `请输入您的年龄:` |
|
|
|
+| 性别 | `String` | `请输入您的性别(男/女):` |
|
|
|
+| 身高(米) | `double` | `请输入您的身高(米):` |
|
|
|
+| 体重(公斤) | `double` | `请输入您的体重(公斤):` |
|
|
|
+| 是否在校 | `boolean` | `请输入您是否在校(true/false):` |
|
|
|
+
|
|
|
+### 开发中常用的类型选择
|
|
|
+
|
|
|
+| 场景 | 推荐类型 | 说明 |
|
|
|
+|------|----------|------|
|
|
|
+| 整数 | `int` | 大部分整数使用 int |
|
|
|
+| 字符、数字、符号 | `String` | 其余所有情况基本都用 String |
|
|
|
+| 小数 | `double` | 所有小数都使用 double |
|
|
|
+| 二值选择 | `boolean` | 可能出现 2 个值的,一般用于判断 |
|
|
|
+
|
|
|
+### 完整代码示例
|
|
|
+
|
|
|
+```java
|
|
|
+public static void main(String[] args) {
|
|
|
+ // 1、创建 Scanner 对象
|
|
|
+ Scanner sc = new Scanner(System.in);
|
|
|
+
|
|
|
+ System.out.println("请输入您的姓名:");
|
|
|
+ String name = sc.next();
|
|
|
+ System.out.println("请输入您的学号:");
|
|
|
+ String id = sc.next();
|
|
|
+ System.out.println("请输入您的年龄:");
|
|
|
+ int age = sc.nextInt();
|
|
|
+ System.out.println("请输入您的性别(男/女):");
|
|
|
+ String gender = sc.next();
|
|
|
+ System.out.println("请输入您的身高(米):");
|
|
|
+ double height = sc.nextDouble();
|
|
|
+ System.out.println("请输入您的体重(公斤):");
|
|
|
+ double weight = sc.nextDouble();
|
|
|
+ System.out.println("请输入您是否在校(true/false):");
|
|
|
+ boolean isStudent = sc.nextBoolean();
|
|
|
+
|
|
|
+ System.out.println("======== 学生信息卡 ========");
|
|
|
+ System.out.println("姓名:" + name);
|
|
|
+ System.out.println("学号:" + id);
|
|
|
+ System.out.println("年龄:" + age);
|
|
|
+ System.out.println("性别:" + gender);
|
|
|
+ System.out.println("身高:" + height);
|
|
|
+ System.out.println("体重:" + weight);
|
|
|
+ System.out.println("在校学生:" + isStudent);
|
|
|
+
|
|
|
+ // BMI = 体重 ÷ (身高 × 身高)
|
|
|
+ double bmi = weight / (height * height);
|
|
|
+ System.out.printf("BMI:%.2f", bmi);
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 体型判定
|
|
|
+ int b;
|
|
|
+ if (bmi < 18.5) {
|
|
|
+ b = 1;
|
|
|
+ } else if (bmi >= 18.5 && bmi < 24) {
|
|
|
+ b = 2;
|
|
|
+ } else if (bmi >= 24 && bmi < 28) {
|
|
|
+ b = 3;
|
|
|
+ } else {
|
|
|
+ b = 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.print("体型判定:");
|
|
|
+ switch (b) {
|
|
|
+ case 1 -> System.out.println("偏瘦");
|
|
|
+ case 2 -> System.out.println("正常");
|
|
|
+ case 3 -> System.out.println("偏胖");
|
|
|
+ default -> System.out.println("肥胖");
|
|
|
+ }
|
|
|
+ System.out.println("============================");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### BMI 判定标准
|
|
|
+
|
|
|
+| BMI 范围 | 体型判定 |
|
|
|
+|----------|----------|
|
|
|
+| BMI < 18.5 | 偏瘦 |
|
|
|
+| 18.5 ≤ BMI < 24 | 正常 |
|
|
|
+| 24 ≤ BMI < 28 | 偏胖 |
|
|
|
+| BMI ≥ 28 | 肥胖 |
|
|
|
+
|
|
|
+### 知识点回顾
|
|
|
+
|
|
|
+- **Scanner 基础方法**:
|
|
|
+ - `sc.next()` — 读取字符串
|
|
|
+ - `sc.nextInt()` — 读取整数
|
|
|
+ - `sc.nextDouble()` — 读取小数
|
|
|
+ - `sc.nextBoolean()` — 读取布尔值
|
|
|
+- **printf 格式化输出**:`System.out.printf("BMI:%.2f", bmi);` — 保留两位小数
|
|
|
+- **switch 箭头语法**:`case 1 -> System.out.println("偏瘦");` — Java 14+ 新特性
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、本日总结
|
|
|
+
|
|
|
+| 知识点 | 主要内容 |
|
|
|
+|--------|----------|
|
|
|
+| **Java 方法** | 方法的定义、4 种声明方式、参数传递、方法调用 |
|
|
|
+| **冒泡排序** | 相邻比较、交换、提前结束优化 |
|
|
|
+| **选择排序** | 每轮选最大值、降序排列 |
|
|
|
+| **插入排序** | 已排序/未排序分区、从后往前插入 |
|
|
|
+| **Scanner 综合应用** | 学生信息采集、BMI 计算与体型判定 |
|
|
|
+| **switch 箭头语法** | `case ->` 新式写法 |
|
|
|
+| **printf 格式化** | `%.2f` 保留两位小数 |
|