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
相关产品推荐
相关产品推荐

