Java静态sumOfPoints方法异常:多组分数总和叠加问题排查
问题排查与修复方案
嘿,我一眼就瞅出问题的核心了——你把学生列表oStudent声明成静态成员变量了,这直接导致所有StudentsGroup实例共享同一个列表!当你读取Group1和Group2的学生数据时,两组的学生都被塞进了同一个静态列表里,计算总分的时候自然是把两组的分数加在一起(267+256=523),这就是错误的根源。另外sumOfPoints方法的逻辑也完全跑偏了,根本没用到传入的组实例,咱们一步步来修:
第一步:把共享的静态列表改回实例私有列表
静态变量是类级别的,所有实例共用,每个学生组肯定得有自己独立的学生集合啊!所以把static修饰符去掉:
private List<Student> oStudent = new ArrayList<Student>();
第二步:修正静态的sumOfPoints方法逻辑
你原来的方法里把传入的参数s直接覆盖成静态列表的拷贝,等于白传参数了。静态方法需要接收StudentsGroup类型的参数,然后直接访问该组自己的学生列表计算总分:
public static double sumOfPoints(StudentsGroup group) { double sum = 0.0; // 用增强for循环比迭代器更简洁 for(Student student : group.oStudent) { sum += student.getPoints(); // 顺便提一句:Java规范里方法名要小驼峰,建议把GetPoints改成getPoints } return sum; }
(Java里同个类的实例可以直接访问彼此的私有成员,所以不用担心group.oStudent的访问权限问题)
第三步:修复compareTo方法的逻辑
原来的compareTo里重复调用sumOfPoints还传错了参数,现在直接用修复好的静态方法分别计算两个组的总分,然后比较就行。另外建议把Comparable改成泛型类型,避免强制类型转换:
// 先让类实现泛型的Comparable接口:public class StudentsGroup implements Comparable<StudentsGroup> @Override public int compareTo(StudentsGroup otherGroup) { double group1Sum = StudentsGroup.sumOfPoints(this); double group2Sum = StudentsGroup.sumOfPoints(otherGroup); // 用Double的compare方法更简洁,不用手动写一堆if判断 return Double.compare(group1Sum, group2Sum); }
修复后的调用验证
现在调用静态方法的时候,推荐用类名直接调用(更符合静态方法的使用习惯),当然原来的实例调用也能运行:
System.out.println("Total points of Group1: " + StudentsGroup.sumOfPoints(oGroup1) + "\n"); System.out.println("Total points of Group2: " + StudentsGroup.sumOfPoints(oGroup2) + "\n"); System.out.println("Comparing Group1 to Group2: " + oGroup1.compareTo(oGroup2));
运行后就能得到你想要的正确输出:
Total points of Group1: 267.0
Total points of Group2: 256.0
Comparing Group1 to Group2: 1
额外的小建议
- 遵循Java命名规范:成员变量名用小驼峰(比如把
oStudent改成students),方法名也用小驼峰(GetPoints→getPoints),这样代码可读性更高。 - 尽量避免使用
Object类型作为参数,用泛型或者具体类型更安全,能避免类型转换错误。
内容的提问来源于stack exchange,提问作者Jfc lol
相关产品推荐
相关产品推荐

