当我在我的类中创建一个新的类实例,比如说实例i,并且在类内更改这个实例时,所有的实例都会发生变化;但我只希望实例i发生变化。
这个类被称为Square。
这种效果在Square的一个测试函数中得到了展示。
void testFunction() { Square tempSqr = new Square(x + 1, myTiles, blankIndex); this.toPrint(); // tempSqr.toPrint(); tempSqr.switchTile(1, 2);// switch is editing parent nodes // tempSqr.toPrint(); this.toPrint();}
这会产生以下输出
1 2 34 5 67 8 0
—-这不是输出的一部分,只是为了在stackoverflow上进行格式化
1 2 34 5 67 0 8
请注意,在tempSqr.switchTile(); this.Square();
之后发生了变化。这不是我想要的结果,我只希望tempSqr
发生变化。顺便说一下,tempSqr
确实发生了变化。
这是switchTile()
方法:
public void switchTile(int myX, int myY) { Iterator<Tile> e = myTiles.iterator(); int counter = 0; while (e.hasNext()) { Tile t = e.next(); if (myX == t.getX() && myY == t.getY()) { Tile blank = myTiles.get(blankIndex); int tx = t.getX(); int ty = t.getY(); // ///// int bx = blank.getX(); int by = blank.getY(); // ///////// t.setX(bx); t.setY(by); blank.setX(tx); blank.setY(ty); // ///////////// myTiles.set(counter, t); myTiles.set(blankIndex, blank); } counter++; }}
其余的代码可以在https://github.com/danielGood/AISearchDemo上找到,如果你有兴趣的话。任何帮助都将不胜感激,我已经在这个错误上花费了不少时间。提前感谢。
回答:
你的问题出在myTiles
上。
在第一行,你创建了一个新的Square
,但传递的是同一组tiles。因此,两个square都引用了同一组tiles。
你需要对myTiles
进行深拷贝