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

Java中存储Coordinate对象的数组元素值意外同步变化问题求解

问题原因

Java中Coordinate属于引用类型,数组中存储的是对象的内存地址而非对象本身。直接执行v[1] = v[0]的赋值操作时,只是把v[0]指向的对象地址复制给了v[1],二者最终指向同一个Coordinate实例,因此修改任意一个实例的属性,另一个也会同步变化。

修复方案

步骤1:给Coordinate类添加拷贝能力

优先选择添加拷贝构造方法,逻辑直观易维护:

public class Coordinate {
    public int x;
    public int y;
    // 原有无参构造保留
    public Coordinate() {}
    // 新增拷贝构造方法,传入已有对象复制其属性
    public Coordinate(Coordinate source) {
        this.x = source.x;
        this.y = source.y;
    }
}

步骤2:修正对象赋值逻辑

所有需要复制Coordinate值的场景,不要直接赋值引用,改用以下两种写法之一:

  • 写法1:手动复制属性(适合临时赋值场景)
// 错误写法:v[1] = v[0]
v[1].x = v[0].x;
v[1].y = v[0].y;
  • 写法2:使用拷贝构造创建新对象(适合新增对象场景)

步骤3:修复现有代码中的bug

你提供的Snake类中growTail方法存在同样的引用赋值错误,修改为:

void growTail() {
    lengthOfSnake++;
    // 用拷贝构造创建独立的新坐标对象
    snakePosition[lengthOfSnake] = new Coordinate(snakePosition[lengthOfSnake - 1]);
}
附加说明

你提供的didSnakeEatItself方法返回值逻辑写反了:当蛇头坐标和身体坐标相等时,说明已经咬到自己,应该返回true,当前逻辑是相等返回false,建议同步修正:

boolean didSnakeEatItself() {
    for(int i = 1; i < lengthOfSnake; i++) {
        if((snakePosition[0].x == snakePosition[i].x) && (snakePosition[0].y == snakePosition[i].y)) {
            return true;
        }
    }
    return false;
}

修改完成后,使用你提供的参数direction = "R",width = 26,height = 26运行,修改v[0]的值时v[1]不会再同步变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:06:11