一、引言

在 Java 编程学习进程中,实现一个学生管理系统是极具代表性且实用的案例。它能帮助我们巩固诸多 Java 的基础知识点和常用技术。本文会基于给定的 StudentManagement.java 代码,对其中所运用的知识点和技术展开详尽介绍。

二、代码整体功能概述

此 Java 代码实现了一个简易的学生管理系统,允许用户开展添加学生、删除学生、更新学生信息、查询学生信息以及退出系统等操作。系统借助数组来存储学生对象,并且提供了相应的菜单界面供用户选择操作。

三、知识点与技术详细解析

(一)类与对象

1. 学生类(Student
class Student {
    private String name;
    private int age;
    private String gender;

    // 无参构造器
    public Student() {
    }

    // 有参构造器
    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // getter 和 setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

  • 封装Student 类运用了封装思想,把学生的姓名、年龄和性别属性声明为 private,外部类无法直接访问这些属性,只能通过所提供的 getter 和 setter 方法来获取和修改属性值。这样做提高了数据的安全性和可维护性,防止外部类随意修改数据。
  • 构造器:提供了无参构造器和有参构造器。无参构造器用于创建默认的学生对象,当我们不确定学生的具体信息时可以先创建一个空的学生对象;有参构造器用于在创建对象时直接初始化学生的属性,方便快捷。
2. 学生管理系统类(StudentManagement
public class StudentManagement {
    // 学生对象数组
    private Student[] stus;
    // 实际学生个数
    private int counter;
    // 键盘录入对象
    private Scanner in;

    // 无参构造器:默认容量 100
    public StudentManagement() {
        stus = new Student[100];
        in = new Scanner(System.in);
    }

    // 有参构造器:size 表示初始容量
    public StudentManagement(int size) {
        stus = new Student[size];
        in = new Scanner(System.in);
    }
}

  • 组合StudentManagement 类中包含了一个 Student 对象数组 stus,这是一种组合关系。通过这种方式,StudentManagement 类可以管理多个学生对象,将学生信息的存储和管理功能封装在一起。
  • 构造器重载:提供了无参构造器和有参构造器。用户能够根据需求选择使用默认容量(100)或指定初始容量来创建 StudentManagement 对象,增加了代码的灵活性。

(二)数组

1. 学生对象数组
private Student[] stus;

在 StudentManagement 类里,使用 Student 对象数组 stus 来存储学生信息。数组的长度可在创建 StudentManagement 对象时指定,默认长度为 100。数组是一种简单且常用的数据结构,适合存储同类型的多个元素。

2. 数组扩容
if (counter < stus.length) {
    stus[counter] = new Student(name, age, gender);
    counter++;
    System.out.println("添加成功");
} else {
    // 创建一个新数组,容量为原数组的 2 倍
    Student[] newStus = new Student[stus.length * 2];
    // 将原数组内容复制到新数组
    for (int i = 0; i < stus.length; i++) {
        newStus[i] = stus[i];
    }
    // 将新数组赋值给原数组引用
    stus = newStus;
    // 添加新学生到新数组
    stus[counter] = new Student(name, age, gender);
    counter++;
    System.out.println("添加成功(数组已扩容)");
}

当数组已满时,就需要进行扩容操作。这里创建一个新的数组,其容量为原数组的 2 倍,接着把原数组的内容复制到新数组中,最后将新数组赋值给原数组的引用。这种扩容方式虽然简单,但在数据量较大时可能会影响性能,后续可以考虑使用动态数组类(如 ArrayList)来优化。

(三)输入输出

1. 键盘录入
private Scanner in;
// ...
in = new Scanner(System.in);

使用 Scanner 类从键盘读取用户输入的信息,例如学生的姓名、年龄、性别以及用户选择的操作等。Scanner 类是 Java 中常用的输入类,它提供了多种方法来读取不同类型的数据。

2. 控制台输出
System.out.println("********************");
System.out.println("    学生管理系统");
System.out.println("********************");
// ...

运用 System.out.println() 和 System.out.print() 方法把提示信息和操作结果输出到控制台。println() 方法会在输出内容后换行,而 print() 方法不会换行,根据实际需求选择使用。

(四)控制语句

1. 循环语句
Loop: while (true) {
    // 打印提示信息
    sm.prompt();
    // 获取用户操作
    option = sm.in.nextInt();

    if (option < 0 || option > 4) {
        System.out.println("错误操作,请重试");
        continue;
    }

    switch (option) {
        case 1:
            sm.addStudent();
            break;
        case 2:
            sm.deleteStudent();
            break;
        case 3:
            sm.updateStudent();
            break;
        case 4:
            sm.selectStudent();
            break;
        case 0:
            break Loop;
    }
}

使用 while (true) 创建一个无限循环,持续显示操作菜单并等待用户输入。通过 switch 语句依据用户输入的操作选项执行相应的操作。当用户选择退出系统(选项 0)时,使用 break Loop 语句跳出循环。这里的 Loop 是一个标签,用于标识循环,方便在嵌套循环中准确跳出指定的循环。

2. 条件语句
if (index != -1) {
    // 找到目标学生,执行相应操作
} else {
    System.out.println("找不到目标学生");
}

在查找学生、删除学生、更新学生信息和查询学生信息的方法中,使用 if - else 语句判断是否找到了目标学生,并根据结果执行相应的操作。条件语句是程序中进行逻辑判断的重要工具,能够根据不同的条件执行不同的代码块。

(五)方法封装

1. 方法的定义和调用
// 输出操作提示
public void prompt() {
    System.out.println("********************");
    System.out.println("    学生管理系统");
    System.out.println("********************");
    System.out.println("(1) 添加学生");
    System.out.println("(2) 删除学生");
    System.out.println("(3) 更新信息");
    System.out.println("(4) 查询学生");
    System.out.println("(0) 退出系统");
    System.out.println("********************");
    System.out.print("请选择你的操作: ");
}

// ...

sm.prompt();

把不同的功能封装成不同的方法,例如 prompt() 方法用于输出操作提示,addStudent() 方法用于添加学生等。在 main 方法中调用这些方法来实现系统的各项功能,这样提高了代码的可读性和可维护性。每个方法只负责单一的功能,便于代码的修改和扩展。

源码

import java.util.Scanner;

// 学生类
class Student {
    private String name;
    private int age;
    private String gender;

    // 无参构造器
    public Student() {
    }

    // 有参构造器
    public Student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    // getter和setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

// 学生管理系统类
public class StudentManagement {
    // 学生对象数组
    private Student[] stus;
    // 实际学生个数
    private int counter;
    // 键盘录入对象
    private Scanner in;

    // 无参构造器:默认容量100
    public StudentManagement() {
        stus = new Student[100];
        in = new Scanner(System.in);
    }

    // 有参构造器:size表示初始容量
    public StudentManagement(int size) {
        stus = new Student[size];
        in = new Scanner(System.in);
    }

    // 输出操作提示
    public void prompt() {
        System.out.println("********************");
        System.out.println("    学生管理系统");
        System.out.println("********************");
        System.out.println("(1) 添加学生");
        System.out.println("(2) 删除学生");
        System.out.println("(3) 更新信息");
        System.out.println("(4) 查询学生");
        System.out.println("(0) 退出系统");
        System.out.println("********************");
        System.out.print("请选择你的操作: ");
    }

    // 根据用户录入的学生名称,找到学生在数组中的索引返回
    private int findStudent() {
        int index = -1;
        System.out.print("请输入姓名: ");
        String name = in.next();
        
        for (int i = 0; i < counter; i++) {
            if (stus[i] != null && stus[i].getName().equals(name)) {
                index = i;
                break;
            }
        }
        return index;
    }

    // 添加学生
    public void addStudent() {
        System.out.print("请输入姓名: ");
        String name = in.next();
        System.out.print("请输入年龄: ");
        int age = in.nextInt();
        System.out.print("请输入性别: ");
        String gender = in.next();
        
        if (counter < stus.length) {
            stus[counter] = new Student(name, age, gender);
            counter++;
            System.out.println("添加成功");
        } else {
            // 创建一个新数组,容量为原数组的2倍
            Student[] newStus = new Student[stus.length * 2];
            // 将原数组内容复制到新数组
            for (int i = 0; i < stus.length; i++) {
                newStus[i] = stus[i];
            }
            // 将新数组赋值给原数组引用
            stus = newStus;
            // 添加新学生到新数组
            stus[counter] = new Student(name, age, gender);
            counter++;
            System.out.println("添加成功(数组已扩容)");
        }
    }

    // 删除学生
    public void deleteStudent() {
        int index = findStudent();
        if (index != -1) {
            for (int i = index; i < counter - 1; i++) {
                stus[i] = stus[i + 1];
            }
            stus[counter - 1] = null;
            counter--;
            System.out.println("删除成功");
        } else {
            System.out.println("找不到目标学生");
        }
    }

    // 更新学生信息
    public void updateStudent() {
        int index = findStudent();
        if (index != -1) {
            System.out.print("请输入新的年龄: ");
            int age = in.nextInt();
            System.out.print("请输入新的性别: ");
            String gender = in.next();
            
            stus[index].setAge(age);
            stus[index].setGender(gender);
            System.out.println("更新成功");
        } else {
            System.out.println("找不到目标学生");
        }
    }

    // 查询学生信息
    public void selectStudent() {
        int index = findStudent();
        if (index != -1) {
            Student s = stus[index];
            System.out.println("Name: " + s.getName());
            System.out.println("Age: " + s.getAge());
            System.out.println("Gender: " + s.getGender());
        } else {
            System.out.println("找不到目标学生");
        }
    }

    public static void main(String[] args) {
        // 实例化对象
        StudentManagement sm = new StudentManagement();
        // 用户操作标志
        int option = -1;
        
        Loop: while (true) {
            // 打印提示信息
            sm.prompt();
            // 获取用户操作
            option = sm.in.nextInt();
            
            if (option < 0 || option > 4) {
                System.out.println("错误操作,请重试");
                continue;
            }
            
            switch (option) {
                case 1:
                    sm.addStudent();
                    break;
                case 2:
                    sm.deleteStudent();
                    break;
                case 3:
                    sm.updateStudent();
                    break;
                case 4:
                    sm.selectStudent();
                    break;
                case 0:
                    break Loop;
            }
        }
        
        System.out.println("游戏结束,再见");
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐