一、实验目的
- 掌握继承的基本概念,理解父类与子类的关系,学会在 Java 中实现继承。
- 理解多态性的实现方式,包括方法的重载和覆盖。
- 熟悉
Object
类和Class
类的使用,掌握对象引用转换和访问继承成员的方法。 - 理解访问控制符(
public
、protected
、private
)和final
修饰符的作用。 - 综合运用继承与多态的知识,设计并实现一个较为复杂的医院患者管理系统。
二、实验学时
2学时
三、实验类型
验证性
四、实验需求
1、硬件
每人配备计算机1台,建议优先使用个人计算机开展实验。
2、软件
Windows 10/11操作系统
IntelliJ IDEA 版本号:2024.03
安装IntelliJ IDEA,以及Java运行所需要的相关基础环境。
3、网络
本地主机能够访问互联网和实验中心网络。
4、工具
无。
五、实验任务
5.1 继承的实现:设计一个 Person
类作为父类,Patient
和 Doctor
类作为子类。
5.2 方法的重载与覆盖:在 Doctor
类中实现方法的重载和覆盖。
5.3 对象引用转换:实现父类与子类之间的对象引用转换,并使用 instanceof
检查对象类型。
5.4 访问控制与 final
修饰符:使用访问控制符和 final
修饰符限制类的成员访问。
5.5 综合任务:设计一个 Hospital
类,管理患者和医生,并实现多态性的诊疗过程。
六、实验内容及步骤
6.1、任务 1:继承的实现
步骤:
- 设计一个
Person
类作为父类,包含姓名和年龄属性。 - 设计
Patient
类和Doctor
类作为子类,分别扩展患者和医生的特有属性。
示例代码:
// Person.java
public class Person {
// 属性
private String name;
private int age;
// 构造函数
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 打印信息
public void printInfo() {
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
}
}
// Patient.java
public class Patient extends Person {
// 特有属性
private String symptom;
// 构造函数
public Patient(String name, int age, String symptom) {
super(name, age);
this.symptom = symptom;
}
// Getter 方法
public String getSymptom() {
return symptom;
}
// 覆盖父类方法
@Override
public void printInfo() {
super.printInfo();
System.out.println("症状: " + symptom);
}
}
// Doctor.java
public class Doctor extends Person {
// 特有属性
private String department;
// 构造函数
public Doctor(String name, int age, String department) {
super(name, age);
this.department = department;
}
// Getter 方法
public String getDepartment() {
return department;
}
// 覆盖父类方法
@Override
public void printInfo() {
super.printInfo();
System.out.println("科室: " + department);
}
}
6.2、任务 2:方法的重载与覆盖
步骤:
- 在
Doctor
类中实现方法的重载(diagnose
方法)。 - 在
Doctor
类中覆盖父类的printInfo
方法。
示例代码:
// 在 Doctor 类中添加以下方法
// 方法重载
public void diagnose(Patient patient) {
System.out.println("医生 " + getName() + " 正在为患者 " + patient.getName() + " 进行诊疗。");
System.out.println("患者症状: " + patient.getSymptom());
System.out.println("建议前往 " + department + " 进一步检查。");
}
public void diagnose(Patient patient, String prescription) {
System.out.println("医生 " + getName() + " 正在为患者 " + patient.getName() + " 进行诊疗。");
System.out.println("患者症状: " + patient.getSymptom());
System.out.println("开具处方: " + prescription);
}
// 测试类
public class DoctorTest {
public static void main(String[] args) {
Patient patient = new Patient("张三", 35, "发热");
Doctor doctor = new Doctor("王医生", 40, "发热门诊");
doctor.diagnose(patient);
doctor.diagnose(patient, "退烧药");
}
}
6.3、任务 3:对象引用转换
步骤:
- 实现父类与子类之间的对象引用转换。
- 使用
instanceof
关键字检查对象类型。
示例代码:
public class ObjectConversion {
public static void main(String[] args) {
// 父类引用指向子类对象
Person person = new Patient("李四", 28, "咳嗽");
// 向下转型
if (person instanceof Patient) {
Patient patient = (Patient) person;
patient.printInfo();
}
// 父类引用指向另一个子类对象
person = new Doctor("张医生", 45, "呼吸科");
// 向下转型
if (person instanceof Doctor) {
Doctor doctor = (Doctor) person;
doctor.printInfo();
}
}
}
6.4、任务 4:访问控制与 final
修饰符
步骤:
- 使用访问控制符(
private
、protected
)限制类的成员访问。 - 使用
final
修饰符定义不可继承的类和方法。
// 使用 final 修饰符定义不可继承的类
public final class MedicalRecord {
private String recordId;
protected String diagnosis;
public MedicalRecord(String recordId, String diagnosis) {
this.recordId = recordId;
this.diagnosis = diagnosis;
}
// final 方法,不可覆盖
public final void printRecord() {
System.out.println("病历号: " + recordId);
System.out.println("诊断结果: " + diagnosis);
}
}
// 测试类
public class AccessControlTest {
public static void main(String[] args) {
MedicalRecord record = new MedicalRecord("12345", "感冒");
record.printRecord();
}
}
6.5、任务 5:综合任务 - 医院管理系统
步骤:
- 设计一个
Hospital
类,管理患者和医生。 - 实现多态性的诊疗过程,通过父类引用调用子类方法。
示例代码:
import java.util.ArrayList;
import java.util.List;
// Hospital.java
public class Hospital {
private List<Person> people;
// 构造函数
public Hospital() {
people = new ArrayList<>();
}
// 添加人员
public void addPerson(Person person) {
people.add(person);
System.out.println("添加人员: " + person.getName());
}
// 多态性诊疗过程
public void processDiagnosis() {
for (Person person : people) {
if (person instanceof Doctor) {
Doctor doctor = (Doctor) person;
for (Person p : people) {
if (p instanceof Patient) {
Patient patient = (Patient) p;
doctor.diagnose(patient);
}
}
}
}
}
// 测试类
public static void main(String[] args) {
Hospital hospital = new Hospital();
// 添加患者和医生
hospital.addPerson(new Patient("张三", 35, "发热"));
hospital.addPerson(new Patient("李四", 28, "咳嗽"));
hospital.addPerson(new Doctor("王医生", 40, "发热门诊"));
hospital.addPerson(new Doctor("张医生", 45, "呼吸科"));
// 诊疗过程
hospital.processDiagnosis();
}
}
七、实验考核
本实验考核采用【实验随堂查】方式开展。
每个实验完成后,在实验课上通过现场演示的方式向实验指导教师进行汇报,并完成现场问答交流。
每个实验考核满分100分,其中实验成果汇报60分,现场提问交流40分。
实验考核流程:
(1)学生演示汇报实验内容的完成情况,实验指导老师现场打分。
(2)指导老师结合实验内容进行提问,每位学生提问2-3个问题,根据回答的情况现场打分。
(3)实验考核结束后,进行公布成绩。