面向对象设计学生管理系统需以person为抽象父类,派生student、teacher和course等实体类,通过封装、继承、多态实现职责分离与可扩展性。

用面向对象思想设计学生管理系统,核心是把现实中的“人”“课”“成绩”等概念变成类,并让它们各司其职、相互协作。不是堆代码,而是建模型——谁该存什么数据、谁该负责什么操作、谁和谁有关系,都要理清楚。
明确角色,定义基础类
先从最底层实体开始:学生、老师、课程都不是泛泛而谈的名词,而是可实例化的类。
- Person 抽象类作为顶层父类,封装共性属性(姓名、年龄、性别)和通用行为(如打印基本信息),体现继承与抽象
- Student 和 Teacher 继承 Person,各自扩展特有字段:学生加学号、年级;老师加工号、职称;避免重复代码
-
Course 类独立存在,包含课程名、编号、学分;若需关联成绩,可用 List
或 Map (key为学号,value为成绩)来组合,体现“has-a”关系
封装数据,控制访问边界
所有属性一律设为 private,外部不能直接读写。比如学号一旦录入就不该被随意改,可在 Student 中将 setId() 设为 package-private 或干脆不提供 setter。
- 每个字段配 getter 方法,必要时加业务校验(如 age 只允许 15–30)
- 重写 toString(),方便调试和打印;重写 equals() 和 hashCode(),确保按学号/工号判断是否同一人
- 用枚举限定取值范围:Grade 枚举 {FRESHMAN, SOPHOMORE, JUNIOR, SENIOR} 替代字符串“大一”,防拼写错误
模块分离,职责单一
系统功能不全塞进一个类里。按逻辑划分为清晰的管理器:
- StudentManager只管学生增删改查,内部用 ArrayList 或 HashMap 存储,对外暴露 add()、removeById()、findByGrade() 等方法
- CourseManager管理课程列表,支持按名称模糊搜索、按学分筛选
- ScoreService处理成绩逻辑:录入、计算平均分、查某门课最高分——它依赖 StudentManager 和 CourseManager,但不碰控制台输入
用多态统一操作,提升扩展性
当需要遍历“所有人”(学生+老师)并打印信息时,不必写两套循环。利用多态:
- 在 Person 中定义 abstract void displayInfo();
- Student 和 Teacher 分别实现,格式各自适配(学生显示年级,老师显示职称)
- 主程序只需 List
people = new ArrayList(); people.addAll(students); people.addAll(teachers); people.forEach(Person::displayInfo); - 未来加“管理员”类?只要继承 Person 并实现 displayInfo(),原有遍历逻辑完全不用改
异常与交互,让系统更可靠
命令行交互不是点缀,而是检验设计是否健壮的试金石:
- 自定义异常如 StudentNotFoundException、InvalidAgeException,在 manager 方法中主动抛出,而不是返回 null 或静默失败
- 主菜单用 Scanner + switch 控制流程,每个功能调用对应 manager 的方法;操作完成后自动返回菜单,避免程序退出
- 关键操作(如删除)增加二次确认提示,防止误操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











