Java 为什么新对象会影响当前对象?

Java 为什么新对象会影响当前对象?,java,eclipse,object,Java,Eclipse,Object,我现在在班级游戏板上。在这个类中,我试图制作一个游戏树,它返回一个列表,列出这个棋盘上所有可能的下一步动作。当这部分代码运行时,它会影响包含该代码的游戏板,导致所有移动实际上都在游戏板上进行,我只是尝试在其中返回单次移动的板。以下是GameBoard中的代码: for(int i = 1; i < 7; i++) { for(int j = 1; j < 7; j++) { //if valid move, add a board with this

我现在在班级游戏板上。在这个类中,我试图制作一个游戏树,它返回一个列表,列出这个棋盘上所有可能的下一步动作。当这部分代码运行时,它会影响包含该代码的游戏板,导致所有移动实际上都在游戏板上进行,我只是尝试在其中返回单次移动的板。以下是GameBoard中的代码:

for(int i = 1; i < 7; i++)
{
    for(int j = 1; j < 7; j++)
    {
        //if valid move, add a board with this move to the list
        if(isValidMove(i, j))
        {
            GameBoard tempBoard = new GameBoard(slots);
            //printout to make sure both object references are different, which they always are
            System.out.println("this board: " + this + " temp: " + tempBoard);
            tempBoard.makeMove(2, i, j);    //use 2 as it is for the AI's move
            tempBoard.rotateA();
            tempBoard.setLastMove(i + " " + j + " " + "A");
            System.out.println("Board with move " + tempBoard.getLastMove());
            tempBoard.printBoard();
            returnList.add(tempBoard);
        }
    }
}
for(int i=1;i<7;i++)
{
对于(int j=1;j<7;j++)
{
//如果移动有效,则将具有此移动的板添加到列表中
if(isValidMove(i,j))
{
游戏板tempBoard=新游戏板(插槽);
//打印输出以确保两个对象引用都是不同的,它们始终是不同的
System.out.println(“此板:+this+”温度:+tempBoard);
tempBoard.makeMove(2,i,j);//使用2作为AI的移动
tempBoard.rotateA();
tempBoard.setLastMove(i++j++A);
System.out.println(“带移动的板”+tempBoard.getLastMove());
tempBoard.printBoard();
返回列表。添加(临时板);
}
}
}
我不明白为什么这不能简单地创建一个新的GameBoard对象,玩有效的移动,并将其添加到列表中。相反,在这个for循环结束时,游戏板上充满了所有可能的动作


编辑:插槽是GameBoard类的专用int[][]

一旦找到有效的移动,就需要打破循环。如果这是一个独立的方法,您可以使用return;将临时板添加到列表后。

最可能的问题是新的游戏板使用插槽,而旧的游戏板也使用插槽。 因此,当新的游戏板在插槽上执行某些操作时,它会更改插槽,因为旧的游戏板也使用插槽,所以其状态也会更改


我不知道插槽的结构,但我认为您也应该为新的游戏板创建一个新的插槽对象。
slots
是什么意思?我想这是因为所有
Gameboard
s共享对
slots
对象的相同引用。因此,更改为一个
游戏板
会影响所有其他
游戏板
s。但是请告诉我们插槽是什么。
slots
是包含片段所在位置的对象吗?如果是这样,那可能是你的问题。您正在生成一个与第一个相同的新对象,因此将从两个GameBoard对象中看到该对象的更改。是的,您可能应该在创建新GameBoard时复制插槽,以便在尝试计算下一步移动时不会移动原始插槽。基本上,我们需要看到更多的代码来确定发生了什么。请试着用一个简短但完整的问题来演示这个问题。