Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类中创建和更改的类更改原始类_Java_Artificial Intelligence - Fatal编程技术网

Java 在类中创建和更改的类更改原始类

Java 在类中创建和更改的类更改原始类,java,artificial-intelligence,Java,Artificial Intelligence,当我在我的类中时,我在该类中创建一个新的类实例,比如实例I,然后我也在该类中更改该实例两个实例都被更改;在这里,我只想改变我 这个班叫Square 这种效果在平方的测试函数中得到了证明 void testFunction() { Square tempSqr = new Square(x + 1, myTiles, blankIndex); this.toPrint(); // tempSqr.toPrint(); tempSqr.switchTile(1, 2)

当我在我的类中时,我在该类中创建一个新的类实例,比如实例I,然后我也在该类中更改该实例两个实例都被更改;在这里,我只想改变我

这个班叫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 3
4 5 6
7 8 0
----这不是输出的一部分,但用于格式化stackoverflow

1 2 3
4 5 6
7 0 8
注意
tempSqr.switchTile()之后的内容;这个。Square()更改。
这不是我想要的,我只想改变
tempSqr
。 顺便说一下,
tempSqr
正在改变

下面是
switchTile()

public-void-switchTile(int-myX,int-myY){
迭代器e=myTiles.Iterator();
int计数器=0;
while(e.hasNext()){
瓦片t=e.next();
如果(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、 赛蒂(by),;
空白.setX(tx);
blank.setY(ty);
// /////////////
myTiles.set(计数器,t);
myTiles.set(blankIndex,blank);
}
计数器++;
}
}

代码的其余部分以防您感兴趣。任何帮助都将不胜感激,我已经在这个错误上花了很多时间。提前感谢。

您的问题在于
myTiles

在第一行中,您正在创建一个新的
正方形
,但传递的是同一组分幅。因此,两个正方形都引用同一组瓷砖


您需要在myTiles上执行深度复制。第一段非常混乱。我无法访问代码(GitHub是否再次遭到DDOS攻击?叹气…),但当有人说当他们在一个实例中更改字段时,它在另一个实例中更改,通常会有一些
静态
成员不应该是
静态
。有时,一旦实例被创建为另一个实例的副本,但该对象有一个成员是对另一个对象的引用,该副本就应该复制另一个对象,而不是复制引用。
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++;
    }
}