如何在Java PatientFlow类中创建Patient对象数组并解决static引用问题
问题解决方案
一、static无法访问非静态成员问题修复
Java中static修饰的方法属于类本身,非静态属性/方法属于类的实例对象,因此static方法不能直接调用非静态成员。你现有代码中的main方法写法已经是正确解法:先创建PatientFlow类的实例对象,再通过实例对象调用非静态的init调度方法,之前出现报错大概率是你调试时未创建实例直接调用类内非静态成员导致的,现有main逻辑无需调整。
二、Patient对象数组创建存储实现
实现逻辑:
- 在PatientFlow类中定义Patient数组、当前存储患者数的计数变量,可在类构造方法中初始化数组的固定容量
- 合并重复的
readPatient1、readPatient2方法为通用的单患者信息录入方法,每次录入完成后将生成的Patient对象存入数组 - 原有逻辑中调用
p1、p2的位置改为从数组中按索引取值即可
修改后的关键代码:
import java.time.*; import java.util.*; public class PatientFlow { // 替换原有p1、p2定义为数组 private Patient[] patientArr; // 记录当前已存储的患者数量,同时作为下一个存储位置的下标 private int patientCount = 0; Scanner scan=new Scanner(System.in); enum weekdays {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday} // 新增构造方法初始化数组,这里设置最多支持存储20个预约,可按需调整 public PatientFlow() { patientArr = new Patient[20]; } // 合并后的通用患者信息录入方法 public void readPatient(int patientOrder) { System.out.println("请输入第" + patientOrder + "位预约人的姓名:"); String name = scan.nextLine(); System.out.println(name + ",请输入出生日期,格式为yyyy-mm-dd:"); String dob = scan.nextLine(); age(dob); System.out.println("请输入现居住地址:"); String address= scan.nextLine(); System.out.println("请输入性别:"); String gender = scan.nextLine(); System.out.println("请输入8位医保号码:"); int medicareNum = scan.nextInt(); int medicareFinal = medicare(medicareNum); String shift = scan.nextLine(); System.out.println("请选择疫苗接种预约日期:"); String appDay = scan.nextLine(); weekdays(appDay); System.out.println("请选择" + appDay + "的接种时间:"); String time = scan.nextLine(); // 创建对象存入数组 patientArr[patientCount] = new Patient(name,dob,address,gender,medicareNum,appDay,time); System.out.println("预约信息已录入:"); System.out.println("-----------------------------------------------" + "\n" + patientArr[patientCount]); System.out.println("-----------------------------------------------"); // 计数+1 patientCount++; } // 原有age、medicare、weekdays方法无需修改,此处省略 public void confirmation() { int answer; String shift; System.out.println("请确认所有预约信息是否正确,需要修改请选择对应序号,确认完成请按3:"); for(int i=0;i<patientCount;i++) { System.out.println("按" + (i+1) + "修改" + patientArr[i].getName() + "的预约信息"); } System.out.println("按3完成预约"); answer = scan.nextInt(); shift = scan.nextLine(); if(answer >=1 && answer <= patientCount) { // 重新录入对应患者信息,数组下标为answer-1,录入时会覆盖原有下标数据 patientCount--; readPatient(answer); confirmation(); } if (answer==3) { System.out.println("感谢使用线上预约服务,您的预约信息如下:"); for(int i=0;i<patientCount;i++) { System.out.println("-----------------------------------------------"); System.out.println(patientArr[i]); } System.out.println("-----------------------------------------------"); System.out.println("请提前10分钟到场并通过对应程序签到,接种地点为AIS"); System.exit(0); } } public void PatientBook() { String answer; System.out.println("\n"); System.out.println("是否需要新增另一个预约?请输入yes/no:"); answer = scan.nextLine(); switch (answer) { case "yes": readPatient(2); confirmation(); case "no": System.out.println("感谢使用线上预约服务,您的预约信息如下:"); System.out.println("-----------------------------------------------" + "\n" + patientArr[0]); System.out.println("-----------------------------------------------"); System.out.println("请提前10分钟到场并通过对应程序签到,接种地点为AIS"); System.exit(0); } } public void init() { readPatient(1); PatientBook(); readPatient(2); confirmation(); } public static void main(String [] args) { PatientFlow pf = new PatientFlow(); pf.init(); } }
拓展说明
如果需要支持不固定数量的患者存储,更推荐使用ArrayList<Patient>替代数组,无需提前固定容量,自动实现扩容,使用方式如下:
// 定义 private ArrayList<Patient> patientList = new ArrayList<>(); // 存入对象 patientList.add(new Patient(name,dob,address,gender,medicareNum,appDay,time)); // 取值 patientList.get(索引); // 获取已存储数量 patientList.size();
内容的提问来源于stack exchange,提问作者Notjesus1
相关产品推荐
相关产品推荐

