基于面向对象的三大特性实现学生管理系统

基于封装、继承、多态三大特性,可设计一个结构清晰、可扩展的学生管理系统。以下从核心类设计、特性应用到完整实现逐步解析:

 

一、系统核心类设计

 

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 并添加特有属性。

 

通过三大特性的结合,系统具备良好的可维护性和扩展性,例如新增学生类型时,只需定义新子类并实现接口,无需修改原有核心逻辑,体现了面向对象设计的灵活性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值