|
|
@@ -0,0 +1,341 @@
|
|
|
+# 2026-07-20 JavaSE 课后作业
|
|
|
+
|
|
|
+> **课程内容**:面向对象基础(类与对象、成员变量与成员方法)、封装(private / setter / getter / this)、成员变量 vs 局部变量、对象数组、包(Package)
|
|
|
+>
|
|
|
+> **涉及前序知识**:方法 4 种声明方式、数组作为方法参数、三种排序算法(冒泡/选择/插入)、Random 随机数
|
|
|
+>
|
|
|
+> **提交方式**:在 `提交\姓名\` 目录下创建对应的 Java 源文件
|
|
|
+>
|
|
|
+> **截止时间**:下次上课前
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 一、基础题(必做)
|
|
|
+
|
|
|
+### 题目 1:学生类定义与对象创建
|
|
|
+
|
|
|
+**难度**:⭐
|
|
|
+**知识点**:类与对象、成员变量、成员方法
|
|
|
+
|
|
|
+定义一个 `Student` 类,包含以下成员:
|
|
|
+
|
|
|
+| 成员类型 | 名称 | 说明 |
|
|
|
+|---------|------|------|
|
|
|
+| 成员变量 | `name`(String) | 学生姓名 |
|
|
|
+| 成员变量 | `age`(int) | 学生年龄 |
|
|
|
+| 成员变量 | `className`(String) | 班级名称 |
|
|
|
+| 成员方法 | `showInfo()` | 输出学生所有信息,格式见下方 |
|
|
|
+| 成员方法 | `study(String course)` | 输出"xxx 正在学习 xxx",例如"张三 正在学习 Java" |
|
|
|
+
|
|
|
+**输出格式要求**:
|
|
|
+```
|
|
|
+调用 showInfo() 输出:
|
|
|
+姓名:张三
|
|
|
+年龄:25
|
|
|
+班级:J260713
|
|
|
+
|
|
|
+调用 study("Java") 输出:
|
|
|
+张三 正在学习 Java
|
|
|
+```
|
|
|
+
|
|
|
+**要求**:
|
|
|
+- 在 `main` 方法中创建 **2 个** `Student` 对象
|
|
|
+- 为每个对象的属性赋值
|
|
|
+- 依次调用 `showInfo()` 和 `study()` 方法
|
|
|
+
|
|
|
+**示例代码框架**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author 你的姓名
|
|
|
+ * @title 题目1:学生类定义与对象创建
|
|
|
+ * @create 2026/7/20
|
|
|
+ */
|
|
|
+public class Demo_01_姓名 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 创建第一个学生对象
|
|
|
+ // 为属性赋值
|
|
|
+ // 调用方法
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 将 Student 类定义在同一个文件中
|
|
|
+class Student {
|
|
|
+ String name;
|
|
|
+ int age;
|
|
|
+ String className;
|
|
|
+
|
|
|
+ public void showInfo() {
|
|
|
+ // 输出学生信息
|
|
|
+ }
|
|
|
+
|
|
|
+ public void study(String course) {
|
|
|
+ // 输出学习信息
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 💡 **提示**:同一个 `.java` 文件中可以定义多个类,但只能有一个 `public class`。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 2:员工信息封装(Emp 类)
|
|
|
+
|
|
|
+**难度**:⭐⭐
|
|
|
+**知识点**:封装(private、setter/getter)、this 关键字、合法性校验
|
|
|
+
|
|
|
+定义一个 `Emp`(员工)类,要求对属性进行**封装**:
|
|
|
+
|
|
|
+**私有属性**:
|
|
|
+
|
|
|
+| 属性 | 类型 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `id` | String | 员工编号 |
|
|
|
+| `name` | String | 员工姓名 |
|
|
|
+| `salary` | double | 薪资(元) |
|
|
|
+
|
|
|
+**公有方法要求**:
|
|
|
+1. **setter/getter**:为每个属性提供标准的 setter 和 getter 方法(参数名与成员变量同名时使用 `this` 区分)
|
|
|
+2. **合法性校验**:`setSalary(double salary)` 中,如果薪资小于 0,输出"薪资不能为负数!",否则正常赋值
|
|
|
+3. **业务方法**:`work()` —— 输出"工号 xxx 的员工 xxx 正在工作……"
|
|
|
+
|
|
|
+**测试要求**:
|
|
|
+- 在 `main` 方法中创建 `Emp` 对象
|
|
|
+- 通过 setter 赋值(包含合法的薪资和一次非法的负薪资测试)
|
|
|
+- 调用 `work()` 方法
|
|
|
+- 通过 getter 输出所有属性
|
|
|
+
|
|
|
+**示例代码框架**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author 你的姓名
|
|
|
+ * @title 题目2:员工信息封装
|
|
|
+ * @create 2026/7/20
|
|
|
+ */
|
|
|
+public class Demo_02_姓名 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Emp emp = new Emp();
|
|
|
+ // 通过 setter 赋值
|
|
|
+ // 测试非法薪资
|
|
|
+ // 调用 work 方法
|
|
|
+ // 通过 getter 输出信息
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class Emp {
|
|
|
+ private String id;
|
|
|
+ private String name;
|
|
|
+ private double salary;
|
|
|
+
|
|
|
+ // 请补全 getter/setter 方法(使用 this 区分同名参数)
|
|
|
+ // 补全 work() 方法
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 💡 **提示**:当 setter 参数名与成员变量同名时,`this.成员变量 = 参数;` 是标准写法,不能省略 `this`。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、进阶题(必做)
|
|
|
+
|
|
|
+### 题目 3:方法重用的综合计算 — MathTools 工具类
|
|
|
+
|
|
|
+**难度**:⭐⭐⭐
|
|
|
+**知识点**:方法 4 种声明方式综合、质数算法、回文数算法、Random 随机数
|
|
|
+
|
|
|
+定义一个 `MathTools` 工具类,利用方法的 4 种声明方式完成以下功能:
|
|
|
+
|
|
|
+| 方法 | 类型 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `printPrime()` | 无参无返回值 | 输出 1~100 之间的所有质数,每行输出 5 个数 |
|
|
|
+| `printSum(int n, int m)` | 有参无返回值 | 计算并输出 n~m 之间所有整数的累加和 |
|
|
|
+| `isPalindrome(int num)` | 有参有返回值 | 判断一个整数是否为回文数(正着读反着读一样),返回 true/false |
|
|
|
+| `getLuckyNumber()` | 无参有返回值 | 使用 `Random` 生成一个 1~100 之间的幸运数字并返回 |
|
|
|
+
|
|
|
+**要求**:
|
|
|
+- 在 `main` 方法中调用上述 **全部 4 个方法**,验证功能
|
|
|
+- `isPalindrome()` 需测试至少 3 个数(如 12321、12345、1221)
|
|
|
+- 输出格式清晰
|
|
|
+
|
|
|
+**示例运行效果**:
|
|
|
+```
|
|
|
+1~100 之间的质数:
|
|
|
+2 3 5 7 11
|
|
|
+13 17 19 23 29
|
|
|
+...(省略)
|
|
|
+97
|
|
|
+
|
|
|
+n~m 累加和:1 + 2 + ... + 100 = 5050
|
|
|
+
|
|
|
+12321 是回文数:true
|
|
|
+12345 是回文数:false
|
|
|
+1221 是回文数:true
|
|
|
+
|
|
|
+您的幸运数字是:88
|
|
|
+```
|
|
|
+
|
|
|
+**示例代码框架**:
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author 你的姓名
|
|
|
+ * @title 题目3:方法重用的综合计算
|
|
|
+ * @create 2026/7/20
|
|
|
+ */
|
|
|
+public class Demo_03_姓名 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 调用 printPrime() 输出质数
|
|
|
+ // 调用 printSum(1, 100) 计算累加和
|
|
|
+ // 调用 isPalindrome() 测试回文数
|
|
|
+ // 调用 getLuckyNumber() 获取幸运数字
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 无参无返回值:输出 1~100 质数
|
|
|
+ public static void printPrime() {
|
|
|
+ // 补全代码
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 有参无返回值:计算 n~m 累加和
|
|
|
+ public static void printSum(int n, int m) {
|
|
|
+ // 补全代码
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 有参有返回值:判断回文数
|
|
|
+ public static boolean isPalindrome(int num) {
|
|
|
+ return false; // 补全代码
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 无参有返回值:获取幸运数字
|
|
|
+ public static int getLuckyNumber() {
|
|
|
+ return 0; // 补全代码
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 💡 **提示**:
|
|
|
+> - **质数**:大于 1 且只能被 1 和自身整除的数
|
|
|
+> - **回文数**:将数字转为字符串,用 `charAt()` 从两端比较;或用数学方法反转数字后与原数比较
|
|
|
+> - **质数优化**:只需要检查到 `Math.sqrt(n)` 即可
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 题目 4:数组排序工具类 — SortUtils
|
|
|
+
|
|
|
+**难度**:⭐⭐⭐
|
|
|
+**知识点**:数组作为方法参数、冒泡排序、选择排序、插入排序、Arrays.toString()
|
|
|
+
|
|
|
+定义一个 `SortUtils` 排序工具类,将三种排序算法分别封装为**有参无返回值**的方法:
|
|
|
+
|
|
|
+| 方法 | 说明 |
|
|
|
+|------|------|
|
|
|
+| `bubbleSort(int[] arr)` | 冒泡排序(升序),带提前结束优化 |
|
|
|
+| `selectionSort(int[] arr)` | 选择排序(降序),每轮选最大值 |
|
|
|
+| `insertionSort(int[] arr)` | 插入排序(升序),分为已排序和未排序两部分 |
|
|
|
+
|
|
|
+**要求**:
|
|
|
+1. 每个方法中先输出 `"排序前:" + Arrays.toString(arr)`,排序后再输出 `"排序后:" + Arrays.toString(arr)`
|
|
|
+2. 在 `main` 方法中创建一个测试数组,分别调用三种排序方法
|
|
|
+3. 三种方法使用 **同一个原始数组** 测试(每次排序前需要重置数组,或使用副本)
|
|
|
+
|
|
|
+**示例运行效果**:
|
|
|
+```
|
|
|
+======= 冒泡排序(升序) =======
|
|
|
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
|
|
|
+排序后:[10, 13, 14, 22, 29, 33, 37, 48]
|
|
|
+
|
|
|
+======= 选择排序(降序) =======
|
|
|
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
|
|
|
+排序后:[48, 37, 33, 29, 22, 14, 13, 10]
|
|
|
+
|
|
|
+======= 插入排序(升序) =======
|
|
|
+排序前:[29, 10, 14, 37, 13, 33, 48, 22]
|
|
|
+排序后:[10, 13, 14, 22, 29, 33, 37, 48]
|
|
|
+```
|
|
|
+
|
|
|
+**示例代码框架**:
|
|
|
+```java
|
|
|
+import java.util.Arrays;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author 你的姓名
|
|
|
+ * @title 题目4:数组排序工具类
|
|
|
+ * @create 2026/7/20
|
|
|
+ */
|
|
|
+public class Demo_04_姓名 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ int[] arr = {29, 10, 14, 37, 13, 33, 48, 22};
|
|
|
+
|
|
|
+ // 调用冒泡排序(每次用原数组副本)
|
|
|
+ System.out.println("======= 冒泡排序(升序) =======");
|
|
|
+ bubbleSort(Arrays.copyOf(arr, arr.length));
|
|
|
+
|
|
|
+ // 调用选择排序
|
|
|
+ System.out.println("======= 选择排序(降序) =======");
|
|
|
+ selectionSort(Arrays.copyOf(arr, arr.length));
|
|
|
+
|
|
|
+ // 调用插入排序
|
|
|
+ System.out.println("======= 插入排序(升序) =======");
|
|
|
+ insertionSort(Arrays.copyOf(arr, arr.length));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 1. 冒泡排序(升序 + 提前结束优化)
|
|
|
+ public static void bubbleSort(int[] arr) {
|
|
|
+ System.out.println("排序前:" + Arrays.toString(arr));
|
|
|
+ // 补全冒泡排序代码(使用 boolean 标记优化)
|
|
|
+ System.out.println("排序后:" + Arrays.toString(arr));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 选择排序(降序:每轮选最大值放前面)
|
|
|
+ public static void selectionSort(int[] arr) {
|
|
|
+ System.out.println("排序前:" + Arrays.toString(arr));
|
|
|
+ // 补全选择排序代码(降序)
|
|
|
+ System.out.println("排序后:" + Arrays.toString(arr));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 插入排序(升序)
|
|
|
+ public static void insertionSort(int[] arr) {
|
|
|
+ System.out.println("排序前:" + Arrays.toString(arr));
|
|
|
+ // 补全插入排序代码
|
|
|
+ System.out.println("排序后:" + Arrays.toString(arr));
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 💡 **提示**:
|
|
|
+> - 使用 `Arrays.copyOf(原数组, 长度)` 创建数组副本,避免改变原数组
|
|
|
+> - 冒泡排序的提前结束优化:用一个 `boolean` 标记本轮是否有交换
|
|
|
+> - 选择排序降序:每轮选出**最大值**放到未排序部分的**最前面**
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、提交要求
|
|
|
+
|
|
|
+### 文件命名规范
|
|
|
+
|
|
|
+| 题目 | 文件名 | 示例 |
|
|
|
+|------|--------|------|
|
|
|
+| 题目 1 | `Demo_01_姓名.java` | `Demo_01_张三.java` |
|
|
|
+| 题目 2 | `Demo_02_姓名.java` | `Demo_02_张三.java` |
|
|
|
+| 题目 3 | `Demo_03_姓名.java` | `Demo_03_张三.java` |
|
|
|
+| 题目 4 | `Demo_04_姓名.java` | `Demo_04_张三.java` |
|
|
|
+
|
|
|
+### 文件头注释要求
|
|
|
+
|
|
|
+每个 Java 源文件顶部必须包含以下注释模板:
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author 你的姓名
|
|
|
+ * @title 题目X:题目名称
|
|
|
+ * @create 2026/7/20
|
|
|
+ */
|
|
|
+```
|
|
|
+
|
|
|
+### 提交目录结构
|
|
|
+
|
|
|
+```
|
|
|
+提交\
|
|
|
+└─ 姓名\
|
|
|
+ ├─ Demo_01_姓名.java
|
|
|
+ ├─ Demo_02_姓名.java
|
|
|
+ ├─ Demo_03_姓名.java
|
|
|
+ └─ Demo_04_姓名.java
|
|
|
+```
|