目录
1. 案例中哪里体现出了封装性及其好处?(202321336040 郭梦妍)
2. 案例中的setter/getter模式与封装性(202321336040 郭梦妍)
3.案例中某些类的toString()方法 (202321336034 黄诗婷)
4. 案例中几个常用方法解析 (202321336034 黄诗婷)
5. 案例中的面向对象设计 (202321336034 黄诗婷)
1. 案例中哪里体现出了封装性及其好处?(202321336040 郭梦妍)
1.封装的定义:封装是面向对象编程的一个基本特性,它指的是将数据和操作数据的方法绑定在一起,隐藏对象的内部状态和细节,并仅暴露对外的接口。在Java中,实现封装性的主要手段包括使用访问控制符(如private)、构造器、getter和setter方法。
2.举例说明
Student类:
name 属性被声明为私有的 (private String name;)。这意味着类的外部代码不能直接访问或修改这个属性。只有通过类内部的方法,比如上图所示的getter和setter,它们允许外部代码获取和设置
name
属性的值,才能对这个属性进行操作。通过重写toString方法展示了如何以一种可读的方式展示对象的状态,这也是封装的一部分表现形式。
StudentManagementSystem类:
students 列表是一个私有成员变量。这表示从类的外部无法直接访问或修改这个列表,只有通过类提供的公共方法才能对其进行操作。
类提供了构造函数、addStudent、getStudents等公共方法。这些方法允许外部代码与StudentManagementSystem对象交互,又不暴露其内部的实现细节。例如,要向系统中添加一个学生,应该调用addStudent方法,而不是直接修改students列表。
3.封装性的好处
3.1 通过将类的数据成员声明为私有(private),可以防止外部代码直接访问或修改这些数据。只有通过类提供的公共方法(通常是getter和setter)才能访问这些数据成员。这样可以有效地保护对象的状态不受外部影响。
3.2 类的内部实现细节被隐藏起来,当需要更改类的内部实现时,不会影响到该类其他代码的使用。
3.3 封装使得类更加独立,降低了因一处改动而导致多处问题的风险。
3.4 封装有助于调试,可以通过公共方法调用来观察对象,而不需要了解内部实现。
2. 案例中的setter/getter模式与封装性(202321336040 郭梦妍)
什么是setter/getter?有什么用?怎么自动生成?
1.下图为案例中的setter/getter,出现在Student类。
2.setter/getter
2.1 定义:
Getter方法是一种读取类中私有成员变量值的方法。通常,getter方法名称是以get开头,后跟成员变量名称(首字母大写)。例如,如果有一个私有成员变量name,那么对应的getter方法名称将是getName。此方法通常返回该成员变量的值。
Setter方法是一种设置类中私有成员变量值的方法。通常,setter方法名称是以set开头,后跟成员变量名称(首字母大写)。例如,如果有一个私有成员变量name,那么对应的setter方法名称将是setName。此方法通常接受一个参数,并用该参数的值来更新成员变量。2.2 功能:
setter和getter方法主要用于访问和修改类的私有成员变量,它们是实现封装的重要工具,能够提供对类内部状态的受控访问。
2.3 如何自动生成(下图是用IDEA举例)
(1)单击鼠标右键点击生成或直接使用快捷键Alt+Insert
(2)选择Getter和Setter
(3)选择自己想要生成的变量(可以按住shift键再右击)
(4)生成结果例子
3.案例中某些类的toString()方法 (202321336034 黄诗婷)
(1)简述toString方法有什么用?
toString方法用来返回一个表示对象的字符串
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", id='" + id + '\'' + ", major='" + major + '\'' + ", gpa=" + gpa + '}'; }
(2)toString一般应包含什么内容?
在上述代码中,toString方法包含类名Student,以及对象的信息如name,age,gender,id,major,gpa。因此toString方法一般会包含类名以及对象的重要信息。
(3)toString()方法从哪里来?
toString方法是 Java 语言中
Object
类的一个成员方法。Object
类是所有 Java 类的根父类,故Student类中的toString方法是继承其父类Object的toString方法。
4. 案例中几个常用方法解析 (202321336034 黄诗婷)
构造方法(用于初始化)
(1)Student类
- 功能描述:当创建一个新的
Student
实例时,通过这个构造方法可以设置学生的姓名、年龄、性别、学号、专业和GPA。每个参数都对应于一个实例变量,并且使用this
关键字将传入的参数值赋给相应的实例变量。public Student(String name, int age, String gender, String id, String major, double gpa) { this.name = name; this.age = age; this.gender = gender; this.id = id; this.major = major; this.gpa = gpa; }
(2)StudentManagementSystem类
- 此构造方法用于创建一个新的
StudentManagementSystem
实例,并初始化一个用来存储Student
对象的列表。public StudentManagementSystem() { students = new ArrayList<>(); }
方法
(1)addStudent
- 入参:一个Student类型的对象
- 返回参数:void
- 功能描述:用于向students列表中添加Student对象
public void addStudent(Student student) { students.add(student); }
(2)removeStudent
- 入参:一个Student类型的对象
- 返回参数:void
- 功能描述:用于移除students列表中的Student对象
public void removeStudent(Student student) { students.remove(student); }
(3)getStudents
- 入参:无
- 返回参数:一个包含所有Student的列表
- 功能描述:此方法返回当前StudentManagementSystem实例中管理的所有Student对象的列表
public List<Student> getStudents() { return students; }
(4)searchByName
- 入参:学生姓名
- 功能:通过姓名查询学生
- 返回参数:一个包含所有匹配姓名的Student对象的列表。如果没有任何学生匹配,则返回一个空列表
- 功能描述:遍历存储在students 列表中的所有Student对象,并将那些姓名与给定name参数相匹配的学生对象添加到一个新的列表result中
//通过姓名查询学生 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; }
(5)searchByMajor
- 入参:专业名称
- 功能:通过专业查询学生
- 返回类型:一个包含所有匹配专业的Student对象的列表。如果没有任何学生匹配,则返回一个空列表
- 功能描述:遍历存储在students 列表中的所有Student对象,并利用equals方法将那些专业名称与给定major参数相匹配的学生对象添加到一个新的列表result中
//通过专业查询学生 public List<Student> searchByMajor(String major) { List<Student> result = new ArrayList<>(); for (Student student : students) { if (student.getMajor().equals(major)) { result.add(student); } } return result; }
(6)searchByGpa
- 入参:平均绩点
- 功能:通过平均绩点查询学生
- 返回类型:一个包含所有匹配gpa的Student对象的列表。如果没有任何学生匹配,则返回一个空列表
- 功能描述:遍历存储在students 列表中的所有Student对象,并利用equals方法将那些平均绩点与给定gpa参数相匹配的学生对象添加到一个新的列表result中
public List<Student> searchByGpa(double gpa) { List<Student> result = new ArrayList<>(); for (Student student : students) { if (student.getGpa() == gpa) { result.add(student); } } return result; }
5. 案例中的面向对象设计 (202321336034 黄诗婷)
(1)尝试用一段话描述案例所解决的问题。找到其中的名词与动词
描述:将学生的姓名,性别,年龄,学号,专业,平均绩点存入学生管理系统中,在系统中可以增加学生,删除学生。通过姓名,专业,平均绩点查询学生。
名词:姓名,年龄,学号,专业,平均绩点,学生,学生管理系统
动词:增加,删除,查询
(2)如果让你设计,根据上面的分析你会抽象出什么类?各具备什么功能?
Student类:用于存放学生信息
StudentManagementSystem类:用于处理学生信息