我已阅读很多关于复制构造函数的帖子,但我似乎无法让它工作。我调用了复制构造函数,但对象仍然修改了原始文件:
public class Board {
private Square[][] board = getEmptyBoard();
public Board() {
}
public Board(Board originalBoard) {
Square[][] matrix = new Square[6][6];
for(int row = 0; row <= 5; row++) {
for(int col = 0; col <= 5; col++) {
matrix[row][col] = originalBoard.getSquare(row, col);
}
}
this.board = matrix;
}
[...]
}
该类模拟了一个6乘6的Square
类型的电路板。 Square
是一个可以容纳一个或多个Piece
类型对象的对象。
如何使用我的原始主板制作并准确复制它,以便我可以在Piece
处添加和删除Square
s而不触及原始Board
对象?
答案 0 :(得分:3)
你的深层副本还不够深入。您已经创建了自己的2D Square
数组,但数组引用的是与Square
相同的originalBoard
个对象。
您需要复制Square
来自originalBoard
的{{1}}对象。根据{{1}}对象的含义,您需要在复制构造函数中复制其属性(例如Square
)。
答案 1 :(得分:0)
由于您使用的是Object
s(Square
)而不是基元,因此通过关联matrix[row][col] = originalBoard.getSquare(row, col);
您将获得对象的引用,任何修改都将更改这两个引用。
如果要复制确切的状态并进行修改,则应在Square类中实现Cloneable,并在与副本数组关联时调用clone()
。