Java如何对ArrayList中存储对象的指定属性求和及问题排查
问题根因
你的代码问题出在错误地将实例属性声明为static(静态):
- 被
static修饰的成员属于类本身,所有Phone类的实例共享同一份内存空间 - 你每次新建
Phone对象时,赋值操作都会覆盖上一次静态属性的值,最终所有对象读取到的ManufCost都是最后一次创建对象时设置的值,才会出现“反复调用同一个对象属性值”的现象
修正方案
把Phone类非共享属性的static修饰符去掉即可,调整后代码如下:
import java.util.ArrayList; import java.util.Arrays; public class Phone { // 去掉所有实例属性的static修饰 private String Brand; private String Type; private String Model; private String UniqueID; private int ManufCost; // 全局的Phone列表和计数器属于类级别,保留static修饰 public static ArrayList<Phone> Phones = new ArrayList<Phone>(); public static int counter; public Phone(String Brand, String Type, String Model, String UniqueID, int ManufCost) { this.Brand=Brand; this.Type=Type; this.Model=Model; this.UniqueID=UniqueID; this.ManufCost=ManufCost; Phones.add(this); counter =counter +1; System.out.println(counter); } // 求和方法操作的是静态的Phones列表,可以保留static修饰 public static int getCostOfRun() { int TotalCost=0; int tempcost=0; int count=0; while (Phones.size() > count) { tempcost=Phones.get(count).ManufCost; System.out.println(tempcost); TotalCost=TotalCost+tempcost; System.out.println(TotalCost); count++; } return TotalCost; } }
额外优化建议
- 静态成员尽量通过类名直接调用,不要用
this.静态变量的写法,避免语义混淆 - 求和逻辑可以用增强for循环简化,可读性更高:
public static int getCostOfRun() { int totalCost = 0; for (Phone phone : Phones) { totalCost += phone.ManufCost; } return totalCost; }
内容的提问来源于stack exchange,提问作者SomeRandomName
相关产品推荐
相关产品推荐

