项目案例作业2:对案例进行面向对象分析
学生管理系统案例面向对象特性分析报告
目录
学生管理系统案例面向对象特性分析报告
目录
- 案例中哪里体现出了封装性及其好处?(朱芷易 202421336044)
- 案例中的setter/getter模式与封装性(朱芷易 202421336044)
- 2.1 什么是setter/getter?
- 2.2 setter/getter的作用
- 2.3 如何自动生成setter/getter?
- 案例中某些类的toString()方法(朱芷易 202421336044)
- 3.1 toString()方法有什么用?
- 3.2 toString()一般应包含什么内容?
- 3.3 toString()方法从哪里来?
- 案例中几个常用方法解析(朱芷易 202421336044)
- 4.1 Student类 - 构造方法
- 4.2 StudentManagementSystem类 - addStudent方法
- 4.3 StudentManagementSystem类 - searchByName方法
- 4.4 StudentManagementSystem类 - getStudents方法
- 案例中的面向对象设计(朱芷易 202421336044)
- 5.1 案例解决的问题与核心名词/动词
- 5.2 抽象类设计与核心功能
1. 案例中哪里体现出了封装性及其好处?(朱芷易 202421336044)
在案例的 Student类 和 Person类 中,封装性的核心体现是将类的核心属性(如学生的name、age、id、gpa,人的gender等)全部声明为 private(私有)访问权限,外部类无法直接读写这些属性,只能通过类对外暴露的公共方法(setter/getter)进行操作。
封装性带来的核心好处如下:
- 数据安全性:避免外部代码随意篡改内部属性。例如,若直接将
Student类的gpa设为public,外部代码可能将其赋值为负数(如student.gpa = -1.0),而通过setter方法可在内部添加校验逻辑(如判断gpa是否在0-4.0范围内),确保数据合法性(案例未实现校验,但预留了扩展能力)。 - 代码低耦合与可维护性:类的内部实现细节(如属性存储方式、校验规则)与外部代码解耦。若未来需要修改
Student类的属性(如将id从String改为Long),只需修改类内部的setter/getter和构造方法,外部调用代码(如Main类)无需变动。
补充:低耦合意味着尽量减少模块之间的直接关系,使得每个模块都能在尽可能少的依赖下独立工作,高内聚和低耦合这两个原则是软件设计中追求的目标,它们有助于提高软件的质量和效率。
- 接口清晰化:外部类通过明确的
setter/getter方法操作属性,无需关注类的内部逻辑,降低了使用成本。


图1:Student类和Person类中private的声明
2. 案例中的setter/getter模式与封装性(朱芷易 202421336044)
2.1 什么是setter/getter?
- setter(赋值方法):用于给类的私有属性赋值的公共方法,命名规则为
set + 属性名首字母大写(如setName、setGpa),通常包含一个与属性类型一致的参数,无返回值(返回void)。 - getter(取值方法):用于获取类的私有属性值的公共方法,命名规则为
get + 属性名首字母大写(布尔类型属性用is + 属性名首字母大写,如Person类的isGender),无参数,返回值类型与属性类型一致。
2.2 setter/getter的作用
setter/getter是封装性的“桥梁”,在隐藏内部数据的同时,提供了安全的属性访问通道,核心作用包括:
- 可控的属性修改:通过setter可添加业务校验逻辑(如
setAge中判断年龄是否在0-150岁之间),确保属性值符合业务规则。 - 安全的属性读取:通过getter对外暴露属性值,避免直接暴露私有属性,同时可在getter中处理返回结果(如格式化
gpa保留2位小数)。 - 适配封装原则:是“私有属性+公共方法”封装模式的标准实现,确保类的内部状态不被外部随意破坏。
2.3 如何自动生成setter/getter?
主流Java IDE(如IntelliJ IDEA、Eclipse)均支持一键生成,以eclipse为例,步骤如下:
- 使用快捷键:在代码编辑器中打开包含属性的 Java 类文件,按下快捷键 Alt + Shift + S,再按 R 键,会弹出自动生成 setter 和 getter 方法的设置界面;
- 使用菜单:右键点击代码编辑器空白处或类名,选择 “Source” -> “Generate Getters and Setters...”,也可进入设置界面;
![{3CF5A590-212E-4414-8C77-8213F88A190C}]()
图2:在eclipse中点击快捷键“ Alt + Shift + S”选择Setter and Getter
3. 案例中某些类的toString()方法(朱芷易 202421336044)
3.1 toString()方法有什么用?
toString()方法是Java中用于获取对象字符串表示的核心方法,主要作用是:
- 当直接打印对象(如
System.out.println(student))或拼接字符串(如"学生信息:" + student)时,Java会自动调用该对象的toString()方法,返回的字符串将作为打印/拼接结果; - 替代手动拼接属性的繁琐操作(如无需写
"name:" + student.getName() + ", age:" + student.getAge()),简化对象信息的输出; - 便于调试和日志记录,快速查看对象的核心状态(如判断学生的
id和gpa是否正确赋值)。
3.2 toString()一般应包含什么内容?
toString()的核心原则是“清晰、完整地展示对象的核心状态”,通常包含以下内容:
- 类名(明确当前对象所属类型);
- 对象的核心属性(如
Student类的name、id、major、gpa,Person类的name、age、gender); - 属性与值的对应关系(格式通常为“属性名:属性值”)。
案例中Student类的toString()实现就是典型示例:
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", id='" + id + '\'' +
", major='" + major + '\'' +
", gpa=" + gpa +
'}';
}
3.3 toString()方法从哪里来?
toString()方法来源于Java的顶层父类java.lang.Object,所有Java类(包括自定义的Student、Person、StudentManagementSystem)都通过“默认继承”直接拥有该方法。
- 默认实现(Object类的toString()):返回格式为
"类名@哈希码"(如code.Student@1b6d3586),仅能标识对象类型和内存地址,无法展示具体属性,实用性较低; - 案例中的实现:
Student类和Person类通过@Override注解重写了toString()方法,替换为包含属性信息的自定义实现,解决了默认实现的局限性。
4. 案例中几个常用方法解析(朱芷易 202421336044)
以下解析案例中核心业务方法,涵盖构造方法、数据操作方法、查询方法三类,格式为“类名.方法签名 + 入参/功能/返回值 + 功能描述”。
4.1 Student类 - 构造方法
- 方法签名:
Student(String name, int age, String gender, String id, String major, double gpa)- 入参:
name(学生姓名)、age(学生年龄)、gender(学生性别)、id(学生学号)、major(学生专业)、gpa(学生绩点); - 功能:初始化
Student对象,为所有私有属性赋值(通过this.属性名 = 入参绑定); - 返回值:无(构造方法无返回值);
- 描述:是创建
Student实例的唯一入口(案例未提供无参构造),确保每个学生对象在创建时就拥有完整的核心属性。
- 入参:
4.2 StudentManagementSystem类 - addStudent方法
- 方法签名:
void addStudent(Student student)- 入参:
student(待添加的学生对象,类型为Student); - 功能:将入参的学生对象添加到系统内部的
students列表(private List<Student> students)中; - 返回值:无(
void); - 描述:是“添加学生”功能的核心实现,封装了列表的
add操作,外部类(如Main)无需关注列表的存储细节,只需传入Student对象即可完成添加。
![9c2e3612d77a8a245aee2df136b7742a]()
图3:功能1“添加学生”示例
- 入参:
4.3 StudentManagementSystem类 - searchByName方法
- 方法签名:
List<Student> searchByName(String name)- 入参:
name(待搜索的学生姓名,类型为String); - 功能:遍历系统内的
students列表,筛选出name与入参完全一致的所有学生对象,存入新列表; - 返回值:
List<Student>(包含所有符合条件的学生对象,若无匹配则返回空列表); - 描述:实现“按姓名搜索学生”的功能,返回结果支持多学生匹配(如存在多个同名学生),外部类可直接遍历结果列表输出信息(如
Main类的case 3逻辑)。
![cc386b3283399ad6f835f2a949a3018f]()
图4:功能4按照输入的学生姓名搜索学生的个人信息
- 入参:
4.4 StudentManagementSystem类 - getStudents方法
- 方法签名:
List<Student> getStudents()- 入参:无;
- 功能:返回系统内部存储学生的
students列表引用; - 返回值:
List<Student>(系统内所有学生对象的列表); - 描述:为外部类提供“获取所有学生”的入口,支持后续操作(如
Main类的case 2删除学生、case 6显示所有学生)。
![387659510605477ee59730dc06d1ee4e]()
图5:功能6“显示所有学生及其信息”
5. 案例中的面向对象设计(朱芷易 202421336044)
5.1 案例解决的问题与核心名词/动词
- 问题描述:实现一个轻量级学生管理系统,支持用户通过控制台交互,完成“添加学生”“删除学生”“按姓名/专业/GPA搜索学生”“显示所有学生”“退出系统”等操作,实现学生信息的高效管理与查询。
- 核心名词:学生(
Student)、学生管理系统(StudentManagementSystem)、姓名(name)、年龄(age)、性别(gender)、学号(id)、专业(major)、绩点(gpa)、学生列表(List<Student>)、控制台输入(Scanner); - 核心动词:添加(
add)、删除(remove)、搜索(search)、显示(show)、输入(input)、退出(exit)、初始化(initialize)。
5.2 抽象类设计与核心功能
基于“名词抽象为类,动词抽象为方法”的面向对象设计原则,案例抽象出4个核心类,职责与功能如下表所示:
| 类名 | 核心职责 | 核心功能(方法) |
|---|---|---|
Student |
封装学生的属性与行为 | 1. 构造方法:初始化学生属性; 2. setter/getter:读写学生属性;3. toString():返回学生信息字符串。 |
StudentManagementSystem |
封装学生信息的管理逻辑(核心业务类) | 1. addStudent:添加学生;2. removeStudent:删除学生;3. searchByName/ByMajor/ByGpa:按条件搜索学生;4. getStudents:获取所有学生。 |
Main |
程序入口,处理用户交互逻辑 | 1. 初始化Scanner和StudentManagementSystem;2. 循环接收用户输入的操作指令; 3. 通过 switch分支调用StudentManagementSystem的方法完成业务;4. 关闭资源( Scanner)。 |
Person |
封装“人”的通用属性(案例中为独立类,未复用) | 1. 构造方法:初始化人的属性; 2. setter/getter:读写人的属性;3. toString():返回人的信息字符串;4. main:独立的测试逻辑(与学生管理系统无关)。 |
设计合理性:通过类的职责拆分,实现了“数据封装(Student)”“业务逻辑封装(StudentManagementSystem)”“交互逻辑封装(Main)”的解耦,符合“单一职责原则”,便于后续扩展(如新增“修改学生信息”功能,只需在StudentManagementSystem中添加updateStudent方法)。





浙公网安备 33010602011771号