Java中实现包含多类型属性的对象数组的方法咨询
嘿,我完全理解你现在的困惑——面向对象编程(OOP)刚开始确实容易让人摸不着头脑,但你遇到的问题正好是OOP最擅长解决的场景!咱们不用急,一步一步来把混乱的数组改成清晰的对象结构。
核心思路:用类封装项目的所有属性
你现在的问题是,单一的int[]只能存时长,但每个项目其实是一组关联的数据(名称、经理、时长)。OOP的核心就是把这些关联数据封装成一个类,让每个项目都变成这个类的对象,然后用「对象数组」来存储所有项目。
第一步:创建Project类,封装项目的三个属性
首先,新建一个Project.java文件,把每个项目的三个属性都放进去,再加上构造方法、getter/setter(方便访问和修改属性),以及toString方法(方便打印查看项目信息):
public class Project { // 私有字段,封装项目的三个属性 private String projectName; private String projectManager; private int myMonths; // 全参构造方法:创建项目对象时直接传入所有属性 public Project(String projectName, String projectManager, int myMonths) { this.projectName = projectName; this.projectManager = projectManager; this.myMonths = myMonths; } // getter和setter方法:用于访问和修改私有属性 public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } public String getProjectManager() { return projectManager; } public void setProjectManager(String projectManager) { this.projectManager = projectManager; } public int getMyMonths() { return myMonths; } public void setMyMonths(int myMonths) { this.myMonths = myMonths; } // toString方法:打印对象时能看到清晰的项目信息 @Override public String toString() { return "项目名称:" + projectName + ",项目经理:" + projectManager + ",时长:" + myMonths + "个月"; } }
第二步:修改MenuTestClass,用Project[]替代int[]
原来的MenuTestClass只存了时长数组,现在我们要改成存储项目对象数组,同时调整对应的构造方法和setter:
public class MenuTestClass { // 把int数组换成Project对象数组 private Project[] projects; private double average; private boolean averageCanBeCalculated; private int max; // 无参构造:初始化最多存5个项目的数组 public MenuTestClass() { projects = new Project[5]; } // 带参构造:直接传入项目数组 public MenuTestClass(Project[] projects) { this.projects = projects; } // 修改setter方法,接收Project数组 public void setProjects(Project[] projects) { this.projects = projects; } // 后续你可以添加计算平均时长、找最大时长的方法,比如: public void calculateAverage() { if (projects == null) { averageCanBeCalculated = false; return; } int total = 0; int count = 0; for (Project project : projects) { if (project != null) { // 跳过空的位置 total += project.getMyMonths(); count++; } } if (count > 0) { average = (double) total / count; averageCanBeCalculated = true; } else { averageCanBeCalculated = false; } } }
第三步:修改main方法,创建项目对象并加入数组
现在回到你的main方法,调整case 1的逻辑,让用户输入项目的三个信息,创建Project对象后存入数组:
case 1: int n = 1; // 这里可以改成让用户输入项目数量,比如int n = sc.nextInt(); Scanner sc = new Scanner(System.in); // 初始化Project数组,长度为n Project[] projects = new Project[n]; int index = 0; System.out.println("** 仅可添加时长在2到12个月之间的项目 **"); for(int i=0; i<n; i++){ System.out.println("请输入第" + (i+1) + "个项目的名称:"); String name = sc.next(); System.out.println("请输入该项目的项目经理:"); String manager = sc.next(); System.out.println("请输入该项目的时长(单位:月):"); int months = sc.nextInt(); // 验证时长范围 if(months < 2 || months > 12){ System.out.println(" 请输入2到12个月之间的数值,该项目未添加。 "); continue; // 跳过当前循环,不添加这个项目 } // 创建Project对象,存入数组 projects[index++] = new Project(name, manager, months); System.out.println("项目添加成功!"); } // 创建MenuTestClass对象,传入项目数组 MenuTestClass calc = new MenuTestClass(); calc.setProjects(projects); break;
为什么这样做?
这样修改后,数组的每个索引对应的都是一个完整的Project对象——比如projects[0]就包含了第一个项目的名称、经理、时长,再也不会出现数据分散、混乱的问题。而且以后如果要给项目加新属性(比如项目状态、预算),只需要在Project类里加字段和对应的getter/setter就行,非常容易扩展。
内容的提问来源于stack exchange,提问作者Aleo111
相关产品推荐
相关产品推荐

