按值复制二维数组仍然有引用

时间:2013-11-28 02:37:36

标签: java arrays

我有一个类型为ChessPiece[][]的二维数组。我需要它的副本来进行修改,但是对象的值是通过引用传递的,因为当我复制原始数组并进行修改时它们会发生变化。

这是我正在使用的代码。

public static ChessPiece[][] copyChessBoard() {
        ChessPiece[][] resultArray = new ChessPiece[currentBoardState.length][];
        for (int i = 0; i < currentBoardState.length; i++) {
            ChessPiece[] pieces = currentBoardState[i];
            int len = pieces.length;
            resultArray[i] = new ChessPiece[len];
            System.arraycopy(pieces, 0, resultArray[i], 0, len);
        }
        return resultArray;
    }

我从另一个堆栈溢出问题中获取此代码并将其应用于我的情况。看来数组是按值传递的,但是我认为数组包含的对象是通过引用传递的。任何帮助表示赞赏

编辑:尝试回答。

所以说我创建了一个新的“复制”方法,如下所示:

public ChessPiece copyChessPiece() {
    ChessPiece piece = new ChessPiece(Color.BLACK) //original constructor
    piece.x = this.x;
    piece.y = this.y;
    piece.possibleMoves = this.possibleMoves;
    piece.side = this.side;
    return piece;
}

那么我复制完整数组的最终代码是否必须如此?

public static ChessPiece[][] copyChessBoard() {
        ChessPiece[][] resultArray = new ChessPiece[currentBoardState.length][];
        for (int i = 0; i < currentBoardState.length; i++) {
            ChessPiece[] pieces = currentBoardState[i].copyChessPiece();
            int len = pieces.length;
            resultArray[i] = new ChessPiece[len];
            System.arraycopy(pieces, 0, resultArray[i], 0, len);
        }
        return resultArray;
    }

1 个答案:

答案 0 :(得分:1)

有一个名为clone()的Object方法,它返回该实例的一个副本,但具有不同的引用。这在理论上是有效的。但是,克隆不是很容易预测,理想情况下应该在类中重写。有关实例复制的一般性讨论,请参阅this

编辑:为了响应您的更新,您必须确保不复制参考。因此,如果字段x,y,possibleMoves和side是基元,这将正常工作。如果没有,您将遇到与以前相同的问题。