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

1. 案例中哪里体现出了封装性及其好处?(林源龙 202321336057)

(1)封装性的体现:
该案例中主要包含了两个类(Student类、StudentManagementSystem类)来封装学生管理系统的各种属性及其方法。
①Student类:
将学生的各种属性(如name、age、gender、id、major、gpa)定义为私有成员变量,通过提供公有的getter和setter方法来访问和修改这些属性。
②StudentManagementSystem类:
将存储学生的列表students定义为私有成员变量,外部无法直接访问这个列表,只能通过该类提供的公有方法(如addStudent、removeStudent、getStudents等)来操作学生列表。并且定义了多种查询学生信息的方法来对学生进行查找,例如searchByName可以通过学生姓名来查询学生信息,代码如下 所示:

`    public List<Student> searchByName(String name) {
        List<Student> result = new ArrayList<>();
        for (Student student : students) {
            if (student.getName().equals(name)) {
                result.add(student);
            }
        }
        return result;
    }

(2)封装的好处:
数据安全性:通过将数据封装在类内部,并提供适当的访问控制,可以防止外部代码随意修改内部数据,从而保证数据的安全性。
例如,在Student类中,如果不使用封装,外部代码可以直接修改学生的年龄、成绩等属性,可能导致数据不一致或错误。而通过封装,只能通过setAge和setGpa等方法进行修改,这些方法可以在修改数据之前进行一些验证或处理,确保数据的合法性。
代码可维护性
封装使得代码的结构更加清晰,各个类的职责更加明确。当需要修改某个类的内部实现时,只需要修改该类的内部代码,而不会影响到外部代码。
例如,如果要改变学生成绩的存储方式或计算方法,只需要修改Student类中的相关方法,而不会影响到StudentManagementSystem类或Main类中的代码。
代码复用性: 封装好的类可以在不同的项目或模块中复用,提高了代码的复用性。
例如,Student类和StudentManagementSystem类可以在其他学生管理相关的项目中复用,只需要根据具体需求进行适当的调整即可。

2. 案例中的setter/getter模式与封装性(林源龙 202321336057)

什么是setter/getter?有什么用?怎么自动生成?

(1)setter/getter
①setter
setter 方法是用于设置类中的私有属性值的方法。它的主要作用是提供一种安全的方式来修改类内部的私有属性值,在设置属性值时,可以进行一些验证或者逻辑处理,确保属性值的合法性。例如,对于私有属性namesetter 方法通常为public void setName(String name)
②getter
getter方法是用于获取类中私有属性值的方法。它主要的作用就是提供一种安全的方式来获取类内部的私有属性值,使得外部的代码能够访问类内部的私有属性,同时它又遵循封装原则。例如,对于私有属性name,setter 方法通常为public void setName(String name)
(2)自动生成的方法
IntelliJ IDEA 中:可以将鼠标移至已经创建好属性的类内部,然后按下键盘中的Alt + Insert键,在弹出的菜单中选择 “Getter and Setter”,然后选择所要生成getter和setter方法的属性后IDEA 会自动生成相应的方法。例如:要在Person类中生成name和age的getter和setter方法可以按照以上步骤进行生成,如图所示:
①按下键盘中的Alt + Insert键:
步骤一
②选择Getter and Setter后可以进入如下页面:该页面可以提供选择所要创建的属性。
在这里插入图片描述
③选择所要创建的属性(按下shift或ctrl键可以进行多选),然后点击确定即可创建成功,结果如下图所示:
在这里插入图片描述

3. 案例中某些类的toString()方法(林源龙 202321336057)

(1) 简述toString方法有什么用?
一般情况下,该方法是提供对象的字符串表示形式。在该案例中Student类中的toString()方法是对于Object类中toString()方法的覆盖。该方法在该类中的作用是对学生信息进行格式化输出。其代码如所示:

   @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", id='" + id + '\'' +
                ", major='" + major + '\'' +
                ", gpa=" + gpa +
                '}';
    }

输出结果如下图所示:
在这里插入图片描述

(2)toString一般应包含什么内容?
关键属性信息
对于一个对象,toString方法应该包含能够标识该对象的关键属性。例如,在Student类中,toString方法包含了name、age、gender、id、major和gpa等关键属性,以"Student{" + "name='" + name + '\''+ ", age=" + age + ", gender='" + gender + '\''+ ", id='" + id + '\''+ ", major='" + major + '\''+ ", gpa=" + gpa + '}'这样的形式呈现。这些属性能够让使用者快速了解对象的主要内容。
简洁明了
虽然要包含关键属性,但也要保持简洁明了,避免包含过多不必要的信息或者复杂的逻辑。例如,不需要在toString方法中包含与对象主要状态无关的临时变量或者计算结果(除非这些结果对于理解对象状态非常重要)。

(3)toString()方法从哪里来?
根类中的定义
在 Java 中,所有的类都继承自java.lang.Object类,Object类中定义了toString方法。在Object类中的toString方法默认返回的是对象的类名和哈希码(以十六进制表示)。例如,public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}
重写
当我们想要自定义对象的字符串表示形式时,就需要在自定义类中重写toString方法。如Student类中重写toString方法来提供包含学生关键属性的字符串表示形式。在 Java 中,重写toString方法需要遵循一定的规则,例如方法签名(方法名、参数列表、返回类型)要与Object类中的toString方法一致,并且要使用@Override注解(这是一种约定俗成的做法,用于在编译时检查是否正确重写了方法)。

4. 案例中几个常用方法解析(刘振求 202321336054)

简述案例代码几个常用方法的解析:

类名.构造方法名,功能描述;

类名.方法签名(入参、功能、返回参数),功能描述;

类名.方法签名(入参、功能、返回参数),功能描述。

  • Student类:

在这里插入图片描述
在这里插入图片描述

  • Student(String name, int age, String gender, String id, String major, double gpa):构造方法,功能描述为通过给定的学生姓名、年龄、性别、学号、专业和 GPA 创建一个Student对象。
  • getName()/setName(String name):功能描述为获取和设置学生的姓名。无入参,返回学生姓名字符串;入参为要设置的姓名字符串,无返回值。
  • getAge()/setAge(int age)getGender()/setGender(String gender)getId()/setId(String id)getMajor()/setMajor(String major)getGpa()/setGpa(double gpa)getName()/setName(String name) 类似。
  • toString():功能描述为以特定格式返回学生对象的字符串表示。无入参,返回包含学生信息的字符串。
  • StudentManagementSystem类:

在这里插入图片描述

  • StudentManagementSystem():构造方法,功能描述为创建一个StudentManagementSystem对象,并初始化一个空的学生列表。
  • addStudent(Student student):功能描述为向学生管理系统中添加一个学生。入参为要添加的学生对象,无返回值。
  • removeStudent(Student student):功能描述为从学生管理系统中移除一个学生。入参为要移除的学生对象,无返回值。
  • getStudents():功能描述为获取学生管理系统中的所有学生列表。无入参,返回包含所有学生的列表。
  • searchByName(String name):功能描述为根据学生姓名在学生管理系统中进行搜索。入参为要搜索的学生姓名字符串,返回包含匹配学生的列表。
  • searchByMajor(String major):方法签名为searchByMajor(String major),功能描述为根据学生专业在学生管理系统中进行搜索。入参为要搜索的学生专业字符串,返回包含匹配学生的列表。
  • searchByGpa(double gpa):方法签名为searchByGpa(double gpa),功能描述为根据学生 GPA 在学生管理系统中进行搜索。入参为要搜索的学生 GPA 数值,返回包含匹配学生的列表。

5. 案例中的面向对象设计(刘振求 202321336054)

5.1 尝试用一段话描述案例所解决的问题。找到其中的名词与动词。

这段案例代码解决了学生管理的问题。它提供了一个学生管理系统,允许用户进行添加、删除学生以及按姓名、专业和 GPA 搜索学生等操作。
名词:学生(Student)、学生管理系统(StudentManagementSystem)、姓名(name)、年龄(age)、性别(gender)、学号(id)、专业(major)、GPA(gpa)、输入(input)、选择(choice)、结果(results)。
动词:添加(add)、删除(remove)、搜索(search)、展示(show)、输入(enter)、选择(choose)、退出(exit)。

5.2 如果让你设计,根据上面的分析你会抽象出什么类?各具备什么功能?

一、学生类
功能:存储学生的基本信息,包括姓名、年龄、性别、学号、专业和 GPA。提供获取和设置这些信息的方法,以及重写 toString方法以便于输出学生信息。
二、学生管理系统类
功能:定义学生管理系统的基本操作,如添加学生、删除学生、按不同条件搜索学生和获取所有学生列表等。
三、学生管理系统项目类
功能:实现学生管理系统接口,维护一个学生列表,具体实现添加学生、删除学生、按姓名搜索、按专业搜索、按 GPA 搜索和获取所有学生列表等方法。
四、用户交互类
功能:负责与用户进行交互,接收用户的输入,展示系统的输出信息,将用户的选择传递给学生管理系统进行相应的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值