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

时间:2013-03-31 02:50:09

标签: 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(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());
    }
}

在指示的行中,调用对象clearCell的方法alter也会修改当前对象(this)。在最后一次绝望的尝试中,我尝试使用clone()方法(正如您所见)解决它,但它没有用。

发生了什么?我错过了什么?非常感谢你。

1 个答案:

答案 0 :(得分:1)

如果您未在clone()中实施SudokuBoard,那么您可能会获得clone()上定义的默认Object,但不会执行深层复制对象。有关说明,请参阅Deep Copy。如果你真的想在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
    }
}

请注意,如果positionListonXpositionListonY数组中的值不是原始类型,那么您还需要这些值的深层副本。这实际上是一个拷贝构造函数,但我没有给它那个签名(public SudokuBoard( SudokuBoard other)),因为我不知道SudokuBoard的其他内部。

查看SudokuBoard类中定义的更多方法签名会有所帮助,因此我们知道哪些方法可用并且能够理解它们的作用。

修改

class SudokuBoard
{
    public void setBoardFromArray( int[][] otherBoard )
    {
        for( int i = 0; i < otherBoard.length; i++ )
        {
            // Clone the arrays that actually have the data
            this.board[i] = otherBoard[i].clone();
        }
    }
}