Java 对对象所做的任何更改,也会更改当前对象

Java 对对象所做的任何更改,也会更改当前对象,java,object,reference,copy,Java,Object,Reference,Copy,对不起,这个标题不太容易理解,但是我的英语没有帮助。我是一个新的java程序员,尽管读过参数是如何工作的,但我并不真正理解发生了什么 sudokuBoard alter = new sudokuBoard(); this.createRandomSudokuBoard(); alter.setBoardFromArray(this.getBoard().clone()); (...) for(int i = 0; i < 81; i++) { alter.clearCell(

对不起,这个标题不太容易理解,但是我的英语没有帮助。我是一个新的java程序员,尽管读过参数是如何工作的,但我并不真正理解发生了什么

sudokuBoard alter = new sudokuBoard();
this.createRandomSudokuBoard();
alter.setBoardFromArray(this.getBoard().clone());

(...) 

for(int i = 0; i < 81; i++) {
    alter.clearCell(positionListonX[i], positionListonY[i]); <<<<<<<<<<<<< Here
    if(alter.numberOfSolutions(2) < 2) {
        this.clearCell(positionListonX[i], positionListonY[i]);
        alter.setBoardFromArray(this.getBoard().clone());
    } else {
        alter.setBoardFromArray(this.getBoard().clone());
    }
}
sudokuBoard alter=新的sudokuBoard();
this.createRandomSudokuBoard();
alter.setBoardFromArray(this.getBoard().clone());
(...) 
对于(int i=0;i<81;i++){

alter.clearCell(positionListonX[i],positionListonY[i]);如果您没有在
SudokuBoard
中实现
clone()
,那么您可能会得到默认的
clone()
对象上定义,该对象不执行对象的深度复制。有关说明,请参阅。如果您确实希望在
alter
中有一个完全独立的电路板实例,则需要执行以下操作:

class SudokuBoard
{
    public void setBoard( SudokuBoard other )
    {
        for( int i = 0; i < 81; i++ )
        {
            this.positionListonX[i] = other.positionListonX[i];
            this.positionListonY[i] = other.positionListonY[i];
        }
        // Copy any other properties
    }
}

如果您没有在
SudokuBoard
中实现
clone()
对象上定义,该对象不执行对象的深度复制。有关说明,请参阅。如果您确实希望在
alter
中有一个完全独立的电路板实例,则需要执行以下操作:

class SudokuBoard
{
    public void setBoard( SudokuBoard other )
    {
        for( int i = 0; i < 81; i++ )
        {
            this.positionListonX[i] = other.positionListonX[i];
            this.positionListonY[i] = other.positionListonY[i];
        }
        // Copy any other properties
    }
}

现在我更好地理解了它,非常感谢。类的代码在这里,它没有完成,它没有文档化,也没有完成。看起来您正在尝试保留一个副本,只有在您知道更改是好的情况下才对这个.board进行更改。您需要更新setBoardFromArray,以便逐个元素进行复制,而不仅仅是分配数组。我相信您的
克隆
调用不起作用,因为您克隆的是对另一个数组的引用,而不是数据本身。请参阅我对
setBoardToArray
的编辑,我认为它可以满足您的需要。现在我更了解它了,非常感谢。类的代码在这里,它没有完成,没有文档,也没有已完成。看起来您正试图保留一个副本,并且只有在知道更改正确时才对此.board进行更改。您需要更新setBoardFromArray以执行元素对元素的复制,而不仅仅是分配数组。我相信您的
克隆
调用无效,因为您正在克隆对另一个数组的引用,而不是对数组的引用数据本身。请参见我对
setBoardToArray
的编辑,我认为它可以满足您的要求。