本文纲要

  1. 项目概述与运行效果
  2. 整体设计思路
  3. 第一步:编写学生实体类 Student
  4. 第二步:搭建主菜单与无限循环
  5. 第三步:实现添加学生功能
  6. 第四步:实现查看所有学生
  7. 第五步:抽取“根据学号查找索引”的方法
  8. 第六步:实现删除学生功能
  9. 第七步:实现修改学生功能
  10. 第八步:完善添加学生——学号唯一性校验
  11. 完整代码与测试
  12. 总结

项目概述与运行效果

我们将在控制台上实现一个 学生管理系统,提供以下功能菜单:

--------欢迎来到学生管理系统-------- 
1 添加学生 
2 删除学生 
3 修改学生 
4 查看学生 
5 退出 
请输入您的选择:
  • 添加学生:输入学号、姓名、年龄、生日,学号不可重复。
  • 删除学生:根据学号删除学生,若学号不存在则给出提示。
  • 修改学生:根据学号修改学生的姓名、年龄、生日(学号不变)。
  • 查看所有学生:以表格形式展示全部学生信息。
  • 退出系统:结束程序。

主要技术点:使用 ArrayList 存储学生对象,通过 Scanner 接收键盘输入,switch 匹配菜单选项,以及循环标号控制程序退出。

整体设计思路

系统围绕一个 ArrayList<Student> 集合展开,所有增删改查操作都基于该集合

1

2

3

4

5

其他

启动程序

显示主菜单

接收用户选择

switch匹配

添加学生

删除学生

修改学生

查看所有学生

退出循环,程序结束

提示输入有误

返回主菜单

核心步骤:

  1. 定义 Student 类封装学生信息
  2. 创建 ArrayList<Student> 集合容器
  3. 编写主菜单无限循环,通过 Scanner 读取选项并转入对应方法
  4. 实现增、删、改、查四个方法,均操作同一个 list 对象
  5. 提供一个工具方法 getIndex,根据学号返回元素在集合中的索引(不存在则返回 -1)
  6. 第一步:编写学生实体类 Student

将学生的学号、姓名、年龄、生日封装为一个 Student 类,包含私有属性、构造方法和 getter/setter

package com.wb.domain;
 
public class Student {
    private String sid;      // 学号 
    private String name;     // 姓名 
    private int age;         // 年龄 
    private String birthday; // 生日 
 
    public Student() {}
 
    public Student(String sid, String name, int age, String birthday) {
        this.sid = sid;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
 
    public String getSid() { return sid; }
    public void setSid(String sid) { this.sid = sid; }
 
    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 getBirthday() { return birthday; }
    public void setBirthday(String birthday) { this.birthday = birthday; }
}

第二步:搭建主菜单与无限循环

main 方法中创建集合和扫描器,使用 while(true) 配合带标号的 break 实现菜单循环
用户输入 5 时退出

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    ArrayList<Student> list = new ArrayList<>();
 
    lo:
    while (true) {
        System.out.println("--------欢迎来到学生管理系统--------");
        System.out.println("1 添加学生");
        System.out.println("2 删除学生");
        System.out.println("3 修改学生");
        System.out.println("4 查看学生");
        System.out.println("5 退出");
        System.out.println("请输入您的选择:");
 
        String choice = sc.next();
 
        switch (choice) {
            case "1":
                addStudent(list);
                break;
            case "2":
                deleteStudent(list);
                break;
            case "3":
                updateStudent(list);
                break;
            case "4":
                queryStudents(list);
                break;
            case "5":
                System.out.println("感谢您的使用");
                break lo;   // 跳出标号 lo 的 while 循环 
            default:
                System.out.println("您的输入有误");
                break;
        }
    }
}

关键点:
使用 String choice = sc.next(); 接收菜单选项,避免与后续 nextInt() 混用引发问题
break lo; 直接退出外层 while(true) 循环,结束程序

第三步:实现添加学生功能

添加学生方法的基本逻辑:提示并接收学号、姓名、年龄、生日,封装为 Student 对象,加入 list,最后提示添加成功。

public static void addStudent(ArrayList<Student> list) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入学号:");
    String sid = sc.next();
    System.out.println("请输入姓名:");
    String name = sc.next();
    System.out.println("请输入年龄:");
    int age = sc.nextInt();
    System.out.println("请输入生日:");
    String birthday = sc.next();
 
    Student stu = new Student(sid, name, age, birthday);
    list.add(stu);
    System.out.println("添加成功!");
}

注意:此时还未加学号唯一性校验,会在第 8 步完善

第四步:实现查看所有学生

查看学生时,先判断集合是否为空;若为空直接提示并返回,否则打印表头并遍历集合输出

public static void queryStudents(ArrayList<Student> list) {
    if (list.size() == 0) {
        System.out.println("无信息,请添加后重新查询");
        return;
    }
    System.out.println("学号\t\t姓名\t年龄\t生日");
    for (int i = 0; i < list.size(); i++) {
        Student stu = list.get(i);
        System.out.println(stu.getSid() + "\t" + stu.getName() +
                "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
    }
}

使用 \t 制表符使输出对齐

第五步:抽取“根据学号查找索引”的方法

删除和修改都需要根据学号定位元素的位置
我们编写一个通用的 getIndex 方法:

  • 遍历集合,比较每个学生的学号与目标学号
  • 若找到,返回索引位置;若遍历结束仍未找到,返回 -1
public static int getIndex(ArrayList<Student> list, String sid) {
    int index = -1;
    for (int i = 0; i < list.size(); i++) {
        Student stu = list.get(i);
        if (stu.getSid().equals(sid)) {
            index = i;
        }
    }
    return index;
}

这个方法后续会在删除、修改以及添加(学号查重)中复用

第六步:实现删除学生功能

根据用户输入的学号,调用 getIndex 查找索引。若返回 -1 则提示“查无信息”,否则调用 list.remove(index) 删除

public static void deleteStudent(ArrayList<Student> list) {
    System.out.println("请输入您要删除的学生学号:");
    Scanner sc = new Scanner(System.in);
    String deleteSid = sc.next();
 
    int index = getIndex(list, deleteSid);
    if (index == -1) {
        System.out.println("查无信息,请重新输入");
    } else {
        list.remove(index);
        System.out.println("删除成功!");
    }
}

第七步:实现修改学生功能

流程与删除相似:输入要修改的学号 → 找到索引 → 若存在,继续输入新的姓名、年龄、生日,封装新对象,调用 list.set(index, newStudent)

public static void updateStudent(ArrayList<Student> list) {
    System.out.println("请输入您要修改的学生学号:");
    Scanner sc = new Scanner(System.in);
    String updateSid = sc.next();
 
    int index = getIndex(list, updateSid);
    if (index == -1) {
        System.out.println("查无信息,请重新输入");
    } else {
        System.out.println("请输入新的学生姓名:");
        String name = sc.next();
        System.out.println("请输入新的学生年龄:");
        int age = sc.nextInt();
        System.out.println("请输入新的学生生日:");
        String birthday = sc.next();
 
        Student stu = new Student(updateSid, name, age, birthday);
        list.set(index, stu);
        System.out.println("修改成功!");
    }
}

第八步:完善添加学生——学号唯一性校验

初始的添加方法没有判断学号重复。现在需要用 getIndex 进行校验:

  • 用户输入学号后,若返回 -1 则可用,跳出循环继续录入其他信息;
  • 若返回非 -1,则提示“学号已被占用”,要求重新输入,形成 学号输入死循环。

改进步骤:

  1. 将学号输入语句放入 while(true) 中。
  2. 在循环内调用 getIndex 判断是否存在。
  3. 若不存在(返回 -1),执行 break 退出循环;否则继续循环。
  4. 提升 sid 变量的作用域,将其声明在 while 之前。

最终 addStudent 方法修正为:

public static void addStudent(ArrayList<Student> list) {
    Scanner sc = new Scanner(System.in);
    String sid;
 
    while (true) {
        System.out.println("请输入学号:");
        sid = sc.next();
        int index = getIndex(list, sid);
        if (index == -1) {   // 学号不存在,可用 
            break;
        } else {
            // 学号已存在,提示后继续循环让用户重新输入 
            System.out.println("学号已被占用,请重新输入");
        }
    }
 
    System.out.println("请输入姓名:");
    String name = sc.next();
    System.out.println("请输入年龄:");
    int age = sc.nextInt();
    System.out.println("请输入生日:");
    String birthday = sc.next();
 
    Student stu = new Student(sid, name, age, birthday);
    list.add(stu);
    System.out.println("添加成功!");
}

至此,添加学生便具备了学号唯一性控制

完整代码与测试

将以上所有代码整合后结构如下:
com.wb.domain.Student —— 学生实体类
com.wb.test.StudentManager —— 主程序及所有功能方法
(测试类 com.wb.test.TestStudent 可单独验证 getIndex 方法)

StudentManager.java 完整代码:

package com.wb.test;
 
import com.wb.domain.Student;
import java.util.ArrayList;
import java.util.Scanner;
 
public class StudentManager {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Student> list = new ArrayList<>();
 
        lo:
        while (true) {
            System.out.println("--------欢迎来到学生管理系统--------");
            System.out.println("1 添加学生");
            System.out.println("2 删除学生");
            System.out.println("3 修改学生");
            System.out.println("4 查看学生");
            System.out.println("5 退出");
            System.out.println("请输入您的选择:");
 
            String choice = sc.next();
 
            switch (choice) {
                case "1":
                    addStudent(list);
                    break;
                case "2":
                    deleteStudent(list);
                    break;
                case "3":
                    updateStudent(list);
                    break;
                case "4":
                    queryStudents(list);
                    break;
                case "5":
                    System.out.println("感谢您的使用");
                    break lo;
                default:
                    System.out.println("您的输入有误");
                    break;
            }
        }
    }
 
    public static void addStudent(ArrayList<Student> list) {
        Scanner sc = new Scanner(System.in);
        String sid;
 
        while (true) {
            System.out.println("请输入学号:");
            sid = sc.next();
            int index = getIndex(list, sid);
            if (index == -1) {
                break;
            } else {
                System.out.println("学号已被占用,请重新输入");
            }
        }
 
        System.out.println("请输入姓名:");
        String name = sc.next();
        System.out.println("请输入年龄:");
        int age = sc.nextInt();
        System.out.println("请输入生日:");
        String birthday = sc.next();
 
        Student stu = new Student(sid, name, age, birthday);
        list.add(stu);
        System.out.println("添加成功!");
    }
 
    public static void queryStudents(ArrayList<Student> list) {
        if (list.size() == 0) {
            System.out.println("无信息,请添加后重新查询");
            return;
        }
        System.out.println("学号\t\t姓名\t年龄\t生日");
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            System.out.println(stu.getSid() + "\t" + stu.getName() +
                    "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
        }
    }
 
    public static void deleteStudent(ArrayList<Student> list) {
        System.out.println("请输入您要删除的学生学号:");
        Scanner sc = new Scanner(System.in);
        String deleteSid = sc.next();
 
        int index = getIndex(list, deleteSid);
        if (index == -1) {
            System.out.println("查无信息,请重新输入");
        } else {
            list.remove(index);
            System.out.println("删除成功!");
        }
    }
 
    public static void updateStudent(ArrayList<Student> list) {
        System.out.println("请输入您要修改的学生学号:");
        Scanner sc = new Scanner(System.in);
        String updateSid = sc.next();
 
        int index = getIndex(list, updateSid);
        if (index == -1) {
            System.out.println("查无信息,请重新输入");
        } else {
            System.out.println("请输入新的学生姓名:");
            String name = sc.next();
            System.out.println("请输入新的学生年龄:");
            int age = sc.nextInt();
            System.out.println("请输入新的学生生日:");
            String birthday = sc.next();
 
            Student stu = new Student(updateSid, name, age, birthday);
            list.set(index, stu);
            System.out.println("修改成功!");
        }
    }
 
    public static int getIndex(ArrayList<Student> list, String sid) {
        int index = -1;
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            if (stu.getSid().equals(sid)) {
                index = i;
            }
        }
        return index;
    }
}

TestStudent.java 可用于单独验证 getIndex 方法:

public class TestStudent {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("heima001","张三",23,"1999-11-11"));
        list.add(new Student("heima002","李四",24,"1999-12-12"));
        list.add(new Student("heima003","王五",25,"1999-1-1")); // 修正原代码重复添加 stu2 的错误 
 
        int index1 = getIndex(list, "heima001");
        int index2 = getIndex(list, "heima009");
 
        System.out.println(index1); // 0 
        System.out.println(index2); // -1 
    }
    // getIndex 方法同上,此处省略 
}

总结

通过这个控制台版学生管理系统,我们练习了以下 Java 基础技能:

  • 类与对象:定义 Student 类并封装数据
  • 集合框架:使用 ArrayList 存储对象,调用 add、remove、set、get 等方法
  • 流程控制:while 无限循环、带标号的 breakswitch 分支
  • 键盘输入:Scannernext()nextInt() 配合使用时的注意事项
  • 方法抽取与复用:将查找索引的逻辑独立为 getIndex,供删除、修改和添加重复利用,遵循 DRY 原则

从零开始一步步构建一个完整的系统,能帮助初学者建立起“分析 → 设计 → 编码 → 测试”的工程思维

你也可以在此基础上继续扩展,例如:将学生信息保存到文件、增加排序和搜索功能、或改为图形界面,作为进阶练习

Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐