基于封装、继承、多态三大特性,可设计一个结构清晰、可扩展的学生管理系统。以下从核心类设计、特性应用到完整实现逐步解析:
一、系统核心类设计
1. 封装:Student基类(数据与逻辑封装)
public class Student {
// 私有属性,仅通过方法访问(封装)
private String id;
private String name;
private int age;
private double score;
// 构造方法
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// Getter/Setter(封装的接口)
public String getId() { return id; }
public String getName() { return name; }
public int getAge() { return age; }
public void setAge(int age) {
if (age > 0 && age < 100) this.age = age;
else throw new IllegalArgumentException("年龄不合法");
}
public double getScore() { return score; }
public void setScore(double score) {
if (score >= 0 && score <= 100) this.score = score;
else throw new IllegalArgumentException("成绩不合法");
}
// 公共方法(封装业务逻辑)
public String showBasicInfo() {
return "学号:" + id + ", 姓名:" + name + ", 年龄:" + age;
}
}
2. 继承:子类扩展不同学生类型
// 本科生类(继承Student)
public class Undergraduate extends Student {
private String major; // 特有属性
public Undergraduate(String id, String name, int age, String major) {
super(id, name, age); // 调用父类构造
this.major = major;
}
public void setMajor(String major) { this.major = major; }
public String getMajor() { return major; }
// 重写父类方法(多态基础)
@Override
public String showBasicInfo() {
return super.showBasicInfo() + ", 专业:" + major;
}
}
// 研究生类(继承Student)
public class Graduate extends Student {
private String tutor; // 导师
public Graduate(String id, String name, int age, String tutor) {
super(id, name, age);
this.tutor = tutor;
}
public void setTutor(String tutor) { this.tutor = tutor; }
public String getTutor() { return tutor; }
@Override
public String showBasicInfo() {
return super.showBasicInfo() + ", 导师:" + tutor;
}
}
3. 多态:接口与服务类(统一操作不同对象)
// 学生服务接口(定义统一操作)
public interface StudentService {
void addStudent(Student student);
Student findStudentById(String id);
void displayAllStudents();
}
// 学生管理实现类(使用集合存储学生,应用多态)
import java.util.HashMap;
import java.util.Map;
public class StudentManager implements StudentService {
private Map<String, Student> studentMap; // 用Map存储学生,学号为键
public StudentManager() {
studentMap = new HashMap<>();
}
@Override
public void addStudent(Student student) {
if (student == null || student.getId() == null) {
System.out.println("学生信息无效");
return;
}
studentMap.put(student.getId(), student);
System.out.println("添加学生成功:" + student.getName());
}
@Override
public Student findStudentById(String id) {
return studentMap.get(id);
}
@Override
public void displayAllStudents() {
if (studentMap.isEmpty()) {
System.out.println("暂无学生数据");
return;
}
System.out.println("===== 学生列表 =====");
for (Student student : studentMap.values()) {
System.out.println(student.showBasicInfo()); // 多态调用,根据对象类型显示不同信息
if (student instanceof Undergraduate) { // 类型判断(向下转型前校验)
Undergraduate ug = (Undergraduate) student;
System.out.println("类型:本科生,专业:" + ug.getMajor());
} else if (student instanceof Graduate) {
Graduate gd = (Graduate) student;
System.out.println("类型:研究生,导师:" + gd.getTutor());
}
}
}
}
二、系统交互与测试
1. 主程序(菜单驱动交互)
import java.util.Scanner;
public class StudentSystem {
public static void main(String[] args) {
StudentService manager = new StudentManager();
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\n===== 学生管理系统 =====");
System.out.println("1. 添加本科生");
System.out.println("2. 添加研究生");
System.out.println("3. 查询学生");
System.out.println("4. 显示所有学生");
System.out.println("5. 退出系统");
System.out.print("请选择操作:");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1: // 添加本科生
System.out.print("输入学号:");
String id1 = scanner.nextLine();
System.out.print("输入姓名:");
String name1 = scanner.nextLine();
System.out.print("输入年龄:");
int age1 = scanner.nextInt();
scanner.nextLine();
System.out.print("输入专业:");
String major = scanner.nextLine();
manager.addStudent(new Undergraduate(id1, name1, age1, major));
break;
case 2: // 添加研究生
System.out.print("输入学号:");
String id2 = scanner.nextLine();
System.out.print("输入姓名:");
String name2 = scanner.nextLine();
System.out.print("输入年龄:");
int age2 = scanner.nextInt();
scanner.nextLine();
System.out.print("输入导师:");
String tutor = scanner.nextLine();
manager.addStudent(new Graduate(id2, name2, age2, tutor));
break;
case 3: // 查询学生
System.out.print("输入要查询的学号:");
String queryId = scanner.nextLine();
Student student = manager.findStudentById(queryId);
if (student != null) {
System.out.println(student.showBasicInfo());
} else {
System.out.println("未找到该学号的学生");
}
break;
case 4: // 显示所有学生
manager.displayAllStudents();
break;
case 5: // 退出
running = false;
System.out.println("系统已退出");
break;
default:
System.out.println("选择错误,请重新输入");
}
}
scanner.close();
}
}
三、三大特性的具体应用解析
1. 封装的体现
- 数据保护: Student 类的属性设为 private ,通过 getter/setter 添加校验逻辑(如年龄、成绩范围检查)。
- 接口统一: StudentManager 封装了学生的增删改查细节,外部无需关心 HashMap 的实现。
2. 继承的体现
- 代码复用: Undergraduate 和 Graduate 继承 Student ,复用 id 、 name 等公共属性和 showBasicInfo() 方法。
- 逻辑扩展:子类添加特有属性( major 、 tutor )和重写方法,体现“本科生/研究生是一种学生”的关系。
3. 多态的体现
- 接口统一: StudentService 接口定义标准操作, StudentManager 实现接口,上层代码通过接口引用操作不同学生对象。
- 动态调用:遍历 studentMap 时,通过 student.showBasicInfo() 自动调用对应子类的重写方法,无需关心对象具体类型。
四、系统扩展与优化方向
1. 添加异常处理:在数据校验处使用 try-catch 捕获非法输入异常。
2. 引入泛型集合:如 Map<String, Student> 确保类型安全。
3. 增加文件存储:将学生数据保存到文件,实现持久化。
4. 扩展子类:新增 InternationalStudent (留学生)等子类,继承 Student 并添加特有属性。
通过三大特性的结合,系统具备良好的可维护性和扩展性,例如新增学生类型时,只需定义新子类并实现接口,无需修改原有核心逻辑,体现了面向对象设计的灵活性。

被折叠的 条评论
为什么被折叠?



