2026年7月20日-作业.md 10 KB

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() 方法

示例代码框架

/**
 * @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 输出所有属性

示例代码框架

/**
 * @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

示例代码框架

/**
 * @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]

示例代码框架

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 源文件顶部必须包含以下注释模板:

/**
 * @author 你的姓名
 * @title 题目X:题目名称
 * @create 2026/7/20
 */

提交目录结构

提交\
└─ 姓名\
    ├─ Demo_01_姓名.java
    ├─ Demo_02_姓名.java
    ├─ Demo_03_姓名.java
    └─ Demo_04_姓名.java