You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:42:02