# 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 ```