Java方法与对象正确初始化问题求助
代码错误修正与面向对象优化
一、setLetterGrades方法的错误修正
原方法存在语法、逻辑多类错误,以下是修正后的代码及错误说明:
核心错误点:
- 缺少返回类型:方法声明未指定返回类型,该方法返回字母等级字符串列表,需声明为
ArrayList<String>(原代码错误使用ArrayList<Integer>,与存储内容不匹配)。 - 未定义
score变量:循环中直接使用score但未从传入的scores列表中获取元素,需通过scores.get(i)获取当前分数。 - 变量作用域问题:
grade在每个if/else块内定义,导致循环末尾无法访问,需在循环开头统一声明。 - 分数判断逻辑矛盾:
score > 60 && score <= 0逻辑完全错误,应改为score >= 0 && score < 60。
修正后的代码:
import java.util.ArrayList; public static ArrayList<String> setLetterGrades(ArrayList<Integer> scores){ ArrayList<String> grades = new ArrayList<>(); for (int i = 0; i < scores.size(); i++){ Integer score = scores.get(i); String grade; if (score >= 90 && score <= 100){ grade = "A"; } else if (score >= 80 && score < 90){ grade = "B"; } else if (score >= 70 && score < 80){ grade = "C"; } else if (score >= 60 && score < 70){ grade = "D"; } else if(score >= 0 && score < 60){ grade = "F"; } else { grade = "Invalid test score."; } grades.add(grade); } return grades; }
二、GradeBook构造器的错误修正与面向对象优化
原构造器存在语法错误,且不符合面向对象封装原则,以下是优化后的完整类实现:
原代码错误点:
- 参数缺少类型声明:
testName未指定类型,需补充为String testName。 - 集合初始化语法错误:
ArrayList<Integer> testScores = ArrayList<Integer> scores;不符合Java语法,正确方式是通过new ArrayList<>(scores)拷贝传入集合(避免外部修改影响内部状态)。 - 方法调用参数缺失:调用
setLetterGrades()时未传入必要的分数参数。 - 未封装成员变量:直接在构造器内定义局部变量,未作为类的成员属性,不符合面向对象设计原则。
优化后的GradeBook类(符合面向对象特性):
import java.util.ArrayList; public class GradeBook { // 私有成员变量,封装类的内部状态 private String testName; private ArrayList<Integer> testScores; private ArrayList<String> letterGrades; // 构造器:初始化成员变量并生成字母等级 public GradeBook(ArrayList<Integer> scores, String testName) { this.testName = testName; // 拷贝传入的集合,避免外部修改破坏内部数据 this.testScores = new ArrayList<>(scores); // 调用实例方法生成字母等级 this.letterGrades = setLetterGrades(); } // 改为私有实例方法,直接使用类内部的testScores,无需外部传参 private ArrayList<String> setLetterGrades() { ArrayList<String> grades = new ArrayList<>(); // 使用增强for循环,代码更简洁 for (Integer score : testScores) { String grade; if (score >= 90 && score <= 100) { grade = "A"; } else if (score >= 80 && score < 90) { grade = "B"; } else if (score >= 70 && score < 80) { grade = "C"; } else if (score >= 60 && score < 70) { grade = "D"; } else if (score >= 0 && score < 60) { grade = "F"; } else { grade = "Invalid test score."; } grades.add(grade); } return grades; } // 提供getter方法,仅暴露必要数据,且返回集合拷贝保证内部状态安全 public String getTestName() { return testName; } public ArrayList<Integer> getTestScores() { return new ArrayList<>(testScores); } public ArrayList<String> getLetterGrades() { return new ArrayList<>(letterGrades); } }
优化说明:
- 封装性:将类的状态变量设为私有,仅通过getter方法对外暴露,避免外部直接修改内部数据。
- 职责单一:
setLetterGrades改为私有实例方法,仅负责处理当前GradeBook实例的分数,符合类的职责设计。 - 数据安全:构造器和getter方法中均对集合进行拷贝,防止外部引用修改类内部的集合数据。
- 代码简洁性:使用增强for循环替代传统索引循环,提升代码可读性。
内容的提问来源于stack exchange,提问作者Aurelia Kruger
相关产品推荐
相关产品推荐

