Java for循环填充PositionOnBoard数组所有元素均为最后值问题问询
Java数组填充后所有元素相同问题成因分析
核心问题
你遇到的问题本质是数组内所有元素都指向了同一个PositionOnBoard对象实例,所有赋值操作都是修改该对象的属性,最终打印时自然全为最后一次修改的结果。
具体原因拆解
- 你的
parse方法是PositionOnBoard类的非静态成员方法,方法内部直接修改当前对象(this)的x、y属性,最终返回的也是this对象本身,不会创建新的PositionOnBoard实例。 - 你调用
parse的场景是在同为成员方法的LegalMoveChecker内,每次调用parse(positions[i])等价于调用this.parse(positions[i]),只会修改当前调用LegalMoveChecker的PositionOnBoard实例的属性,再将同一个实例的引用赋值给数组的每个下标。 - 循环内逐次打印时,每次刚修改完属性就打印,输出的是当时的属性值,看起来结果正常;但数组存储的全是同一个对象的引用,循环结束后该对象的属性已经被修改为最后一次输入对应的值,此时遍历数组打印所有元素,本质都是打印同一个对象的当前属性,所以全为最后一个值。
修复方案
方案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
相关产品推荐
相关产品推荐

