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

Java for循环填充PositionOnBoard数组所有元素均为最后值问题问询

Java数组填充后所有元素相同问题成因分析

核心问题

你遇到的问题本质是数组内所有元素都指向了同一个PositionOnBoard对象实例,所有赋值操作都是修改该对象的属性,最终打印时自然全为最后一次修改的结果。

具体原因拆解

  1. 你的parse方法是PositionOnBoard类的非静态成员方法,方法内部直接修改当前对象(this)的x、y属性,最终返回的也是this对象本身,不会创建新的PositionOnBoard实例。
  2. 你调用parse的场景是在同为成员方法的LegalMoveChecker内,每次调用parse(positions[i])等价于调用this.parse(positions[i]),只会修改当前调用LegalMoveChecker的PositionOnBoard实例的属性,再将同一个实例的引用赋值给数组的每个下标。
  3. 循环内逐次打印时,每次刚修改完属性就打印,输出的是当时的属性值,看起来结果正常;但数组存储的全是同一个对象的引用,循环结束后该对象的属性已经被修改为最后一次输入对应的值,此时遍历数组打印所有元素,本质都是打印同一个对象的当前属性,所以全为最后一个值。

修复方案

方案1(推荐):将parse改为静态工厂方法,每次返回新实例

需要同步将依赖的工具方法改为静态:

private static int getNumberForChar(char c) {
    int a = (int) c;
    int b = (int) 'a';
    return a - b;
}

public static PositionOnBoard parse(String position) throws IllegalPositionException {
    int x = getNumberForChar(position.charAt(0));
    int y = position.charAt(1) - '1';
    if(x > 7 || y > 7){
        throw new IllegalPositionException("Wrong position");
    }
    return new PositionOnBoard(x, y);
}

修改后原循环逻辑无需改动即可正常运行。

方案2:循环内每次创建新实例后调用parse

无需修改现有方法实现,只调整循环逻辑:

for (int i = 0; i < positions.length; i++){
    pos[i] = new PositionOnBoard().parse(positions[i]);
    System.out.println(pos[i]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:04