循环内创建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
相关产品推荐
相关产品推荐

