学生管理系统面向对象分析报告
小组成员:李天瑞 202421336012
目录
- 学生管理系统面向对象分析报告
- 1. 案例中哪里体现出了封装性及其好处?
- 封装性的体现
- 封装性带来的好处
- 2. 案例中的setter/getter模式与封装性
- 什么是setter/getter?
- setter/getter的作用
- 如何自动生成
- 3. 案例中某些类的toString()方法
- toString()方法的作用
- toString()一般应包含的内容
- toString()方法的来源
- 4. 案例中几个常用方法解析
- Student类构造方法
- StudentManagementSystem.addStudent()
- StudentManagementSystem.searchByName()
- 5. 案例中的面向对象设计
- 5.1 描述案例所解决的问题 找到其中的名词与动词
- 5.2 类设计与功能分配
- Student类
- StudentManagementSystem类
- Main类
- 设计优势:
- 1. 案例中哪里体现出了封装性及其好处?
1. 案例中哪里体现出了封装性及其好处?
封装性的体现
-
私有属性
所有属性都被声明为
private
,外部类无法直接访问和修改这些属性。 -
公共方法
public String getName() { return name; } public void setName(String name) { this.name = name; } // 其他getter和setter方法
通过公共的getter和setter方法来控制对私有属性的访问。
-
数据隐藏
StudentManagementSystem
类中的学生列表也是私有的:private List<Student> students;
封装性带来的好处
- 数据保护:防止外部代码随意修改对象内部状态,确保数据的完整性和一致性。
- 实现细节隐藏:外部使用者不需要知道类内部如何存储数据,只需要知道如何使用公共方法。
- 易于维护:如果需要修改内部实现(如数据验证逻辑),只需修改类内部代码,不影响外部调用者。
- 灵活性:可以在setter方法中添加数据验证逻辑,如检查GPA范围是否合理。
2. 案例中的setter/getter模式与封装性
什么是setter/getter?
Setter和Getter是用于访问和修改类私有属性的公共方法。
-
Getter(获取器):用于读取私有属性的值
public String getName() {return name; }
-
Setter(设置器):用于修改私有属性的值
public void setName(String name) {this.name = name; }
setter/getter的作用
- 控制访问权限:通过方法而非直接访问字段,可以在方法中添加额外的逻辑。
- 数据验证:在setter中可以验证输入数据的有效性。
- 保持兼容性:即使内部实现改变,对外接口保持不变。
- 支持只读或只写属性:只提供getter创建只读属性,只提供setter创建只写属性。
如何自动生成
在主流IDE中自动生成setter/getter的方法:
IntelliJ IDEA:
- 右键点击代码区域
- 选择 "Generate" → "Getter and Setter"
- 选择要生成方法的字段
Eclipse:
- 右键点击代码区域
- 选择 "Source" → "Generate Getters and Setters"
- 选择要生成方法的字段
3. 案例中某些类的toString()方法
toString()方法的作用
toString()
方法的主要作用是返回对象的字符串表示形式,便于调试、日志记录和显示。
toString()一般应包含的内容
- 类名或对象标识
- 所有重要属性的值
- 格式清晰易读
toString()方法的来源
- 继承自Object类:所有Java类都隐式继承自
Object
类,而Object
类包含默认的toString()
实现。 - 默认实现的问题:Object类的
toString()
默认返回:类名@哈希码
(如Student@1b6d3586
),这对调试没有帮助。 - 重写(Override):为了提供有意义的字符串表示,子类需要重写此方法。
4. 案例中几个常用方法解析
Student类构造方法
public Student(String name, int age, String gender, String id, String major, double gpa)
- 入参:学生的所有基本信息(姓名、年龄、性别、学号、专业、GPA)
- 功能:创建Student对象并初始化所有属性
- 返回:新的Student对象实例
- 描述:用于快速创建包含完整信息的学生对象
StudentManagementSystem.addStudent()
public void addStudent(Student student)
- 入参:要添加的Student对象
- 功能:将学生对象添加到管理系统的学生列表中
- 返回:void(无返回值)
- 描述:核心的数据添加方法,维护学生集合
StudentManagementSystem.searchByName()
public List<Student> searchByName(String name)
- 入参:要搜索的学生姓名
- 功能:在现有学生列表中查找所有匹配指定姓名的学生
- 返回:包含匹配学生的List集合
- 描述:提供按姓名精确搜索的功能,返回可能多个同名学生的列表
5. 案例中的面向对象设计
5.1 描述案例所解决的问题 找到其中的名词与动词
问题描述:
本系统需要管理大学中的学生信息,包括添加新学生、删除毕业学生、根据不同条件查询学生信息,以及展示所有在校学生。
名词分析:
- 学生(Student)
- 学号、姓名、年龄、性别、专业、GPA(属性)
- 管理系统(StudentManagementSystem)
- 列表、集合(数据结构)
动词分析:
- 添加(add)
- 删除(remove)
- 搜索/查询(search)
- 显示/获取(get)
- 创建(构造方法)
5.2 类设计与功能分配
基于上述分析,我会设计以下类结构:
Student类
- 属性:name, age, gender, id, major, gpa
- 功能:
- 存储学生基本信息
- 通过getter/setter提供属性访问
- 重写toString()用于信息展示
StudentManagementSystem类
- 属性:List
students - 功能:
- addStudent(): 添加学生到系统
- removeStudent(): 从系统移除学生
- searchByXxx(): 多种条件搜索学生
- getStudents(): 获取所有学生列表
Main类
- 功能:
- 程序入口点
- 接收用户输入
- 调用管理系统功能
- 显示操作结果
设计优势:
- 职责分离:每个类有明确的单一职责
- 高内聚低耦合:相关功能集中在同一类中,类间依赖清晰
- 易于扩展:可以轻松添加新的搜索条件或学生属性
- 可维护性:修改用户界面不影响核心业务逻辑