我有一个类型为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;
}
答案 0 :(得分:1)
有一个名为clone()的Object方法,它返回该实例的一个副本,但具有不同的引用。这在理论上是有效的。但是,克隆不是很容易预测,理想情况下应该在类中重写。有关实例复制的一般性讨论,请参阅this。
编辑:为了响应您的更新,您必须确保不复制参考。因此,如果字段x,y,possibleMoves和side是基元,这将正常工作。如果没有,您将遇到与以前相同的问题。