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

循环内创建Ball对象存入数组后内容异常问题求助

兄弟,我猜你遇到的情况是循环结束后数组里所有Ball对象的内容都和最后一次循环存入的对象一模一样?这种坑我踩过好几次,大概率是对象引用复用的问题,给你捋清楚:

问题根源

你大概率是在循环外面只创建了一个Ball实例,每次迭代只是修改这个实例的属性,然后把同一个对象引用塞进数组里。举个错误示例的伪代码,应该和你写的逻辑差不多:

// 错误写法:循环外初始化单个Ball对象
Ball singleBall = new Ball();
Ball[] ballStorage = new Ball[3];

for (int i = 0; i < 3; i++) {
    // 接收用户输入,修改同一个singleBall的属性
    singleBall.setAttr(getUserInput());
    ballStorage[i] = singleBall;
    // 这里打印ballStorage[i]看起来正确,因为刚改完当前实例的属性
    System.out.println(ballStorage[i]);
}

// 循环结束后打印数组,所有元素全是最后一次修改的内容
System.out.println(Arrays.toString(ballStorage));

为什么会这样?因为数组里存储的是对象的内存引用,不是对象本身。你循环里反复把同一个singleBall的引用存入数组,所以数组里所有位置指向的都是内存中同一个Ball实例。循环内打印时,这个实例的属性刚被更新,所以显示正常;但循环结束后,这个实例的属性是最后一次修改的值,所有数组元素自然都和它保持一致。

解决办法

把Ball对象的创建放到循环内部,每次迭代都生成一个全新的实例:

// 正确写法:循环内创建新的Ball对象
Ball[] ballStorage = new Ball[3];

for (int i = 0; i < 3; i++) {
    // 每次循环都新建一个独立的Ball实例
    Ball newBall = new Ball();
    // 接收用户输入,修改当前这个新实例的属性
    newBall.setAttr(getUserInput());
    ballStorage[i] = newBall;
    System.out.println(ballStorage[i]);
}

// 现在打印数组,每个元素都是独立的对象,内容和迭代时完全一致
System.out.println(Arrays.toString(ballStorage));
快速验证小技巧

你可以在循环内和循环后打印每个Ball对象的哈希码(比如System.out.println(ballStorage[i].hashCode())),如果是同一个对象,哈希码会完全相同;如果是不同对象,哈希码会不一样,这样就能快速确认是不是引用复用的问题。

内容的提问来源于stack exchange,提问作者babymario123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:23:13