项目案例作业2:对案例进行面向对象分析

学生管理系统案例面向对象特性分析报告

目录

学生管理系统案例面向对象特性分析报告

目录

  1. 案例中哪里体现出了封装性及其好处?(朱芷易 202421336044)
  2. 案例中的setter/getter模式与封装性(朱芷易 202421336044)
    • 2.1 什么是setter/getter?
    • 2.2 setter/getter的作用
    • 2.3 如何自动生成setter/getter?
  3. 案例中某些类的toString()方法(朱芷易 202421336044)
    • 3.1 toString()方法有什么用?
    • 3.2 toString()一般应包含什么内容?
    • 3.3 toString()方法从哪里来?
  4. 案例中几个常用方法解析(朱芷易 202421336044)
    • 4.1 Student类 - 构造方法
    • 4.2 StudentManagementSystem类 - addStudent方法
    • 4.3 StudentManagementSystem类 - searchByName方法
    • 4.4 StudentManagementSystem类 - getStudents方法
  5. 案例中的面向对象设计(朱芷易 202421336044)
    • 5.1 案例解决的问题与核心名词/动词
    • 5.2 抽象类设计与核心功能

1. 案例中哪里体现出了封装性及其好处?(朱芷易 202421336044)

在案例的 StudentPerson 中,封装性的核心体现是将类的核心属性(如学生的nameageidgpa,人的gender等)全部声明为 private(私有)访问权限,外部类无法直接读写这些属性,只能通过类对外暴露的公共方法(setter/getter)进行操作。

封装性带来的核心好处如下:

  • 数据安全性:避免外部代码随意篡改内部属性。例如,若直接将Student类的gpa设为public,外部代码可能将其赋值为负数(如student.gpa = -1.0),而通过setter方法可在内部添加校验逻辑(如判断gpa是否在0-4.0范围内),确保数据合法性(案例未实现校验,但预留了扩展能力)。
  • 代码低耦合与可维护性:类的内部实现细节(如属性存储方式、校验规则)与外部代码解耦。若未来需要修改Student类的属性(如将idString改为Long),只需修改类内部的setter/getter和构造方法,外部调用代码(如Main类)无需变动。

补充:低耦合意味着尽量减少模块之间的直接关系,使得每个模块都能在尽可能少的依赖下独立工作,高内聚和低耦合这两个原则是软件设计中追求的目标,它们有助于提高软件的质量和效率。

  • 接口清晰化:外部类通过明确的setter/getter方法操作属性,无需关注类的内部逻辑,降低了使用成本。

{074DE480-8675-48F9-BD9C-8245EC96A4C8}{3DFC466F-B439-4E50-B73C-DFBB2FE21E93}
图1:Student类和Person类中private的声明

2. 案例中的setter/getter模式与封装性(朱芷易 202421336044)

2.1 什么是setter/getter?

  • setter(赋值方法):用于给类的私有属性赋值的公共方法,命名规则为set + 属性名首字母大写(如setNamesetGpa),通常包含一个与属性类型一致的参数,无返回值(返回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为例,步骤如下:

  1. 使用快捷键:在代码编辑器中打开包含属性的 Java 类文件,按下快捷键 Alt + Shift + S,再按 R 键,会弹出自动生成 setter 和 getter 方法的设置界面;
  2. 使用菜单:右键点击代码编辑器空白处或类名,选择 “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()),简化对象信息的输出;
  • 便于调试和日志记录,快速查看对象的核心状态(如判断学生的idgpa是否正确赋值)。

3.2 toString()一般应包含什么内容?

toString()的核心原则是“清晰、完整地展示对象的核心状态”,通常包含以下内容:

  • 类名(明确当前对象所属类型);
  • 对象的核心属性(如Student类的nameidmajorgpaPerson类的nameagegender);
  • 属性与值的对应关系(格式通常为“属性名:属性值”)。

案例中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类(包括自定义的StudentPersonStudentManagementSystem)都通过“默认继承”直接拥有该方法。

  • 默认实现(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. 初始化ScannerStudentManagementSystem
2. 循环接收用户输入的操作指令;
3. 通过switch分支调用StudentManagementSystem的方法完成业务;
4. 关闭资源(Scanner)。
Person 封装“人”的通用属性(案例中为独立类,未复用) 1. 构造方法:初始化人的属性;
2. setter/getter:读写人的属性;
3. toString():返回人的信息字符串;
4. main:独立的测试逻辑(与学生管理系统无关)。

设计合理性:通过类的职责拆分,实现了“数据封装(Student)”“业务逻辑封装(StudentManagementSystem)”“交互逻辑封装(Main)”的解耦,符合“单一职责原则”,便于后续扩展(如新增“修改学生信息”功能,只需在StudentManagementSystem中添加updateStudent方法)。

posted @ 2025-10-08 00:38  Jbuckle  阅读(0)  评论(0)    收藏  举报