我有这个Java代码:
boolean[][] defaultBoard = {{false, false, false},
{false, false, false},
{false, false, false}};
Board board = new Board(defaultBoard);
Board nextBoard = new Board(defaultBoard);
nextBoard.getBoard()[1][5] = true;
board.printBoard();
printBoard
:
public void printBoard() {
for (boolean row[] : board) {
for (boolean cell : row) {
System.out.print( cell ? "#" : "." );
}
System.out.println();
}
System.out.println();
}
但它返回
...
.#.
...
这让我觉得nextBoard
和board
拥有相同的内存地址。我的问题是:如何创建nextBoard
的副本,以便在编辑nextBoard
时,board
也不会被编辑?
答案 0 :(得分:4)
board
和nextBoard
不是相同的。它是您传递给构造函数的defaultBoard
数组。您需要传递不同的数组。否则,您只是修改相同的数组。
更好的是,为了确保Board
的实例始终包含一个新数组,我建议在构造函数中对数组进行深层复制。
答案 1 :(得分:0)
数组是一个对象,因此您将传递对Board
构造函数的引用。由于您使用的是同一个数组,因此board
和nextBoard
共享同一个对象。要避免这种情况,请使用clone
方法。这样,您将获得defaultBoard
阵列的副本以及每个具有自己的板的实例。它看起来像这样:
Board board = new Board(cloneBoard(defaultBoard));
Board nextBoard = new Board(cloneBoard(defaultBoard));
private boolean[][] cloneBoard(boolean[][] boardToClone) {
boolean[][] clone = new boolean[boardToClone.length][];
for(int i = 0; i < boardToClone.length; i++) {
clone[i] = boardToClone[i].clone();
}
return clone;
}
答案 2 :(得分:0)
使用.clone()方法,存在于任何Java Object子类中,即所有这些方法,就我所知。
答案 3 :(得分:0)
在这种情况下,我会让电路板根据尺寸
创建数组class Board {
final boolean[] board;
public Board(int width, height) {
board = new[width][height];
}
public boolean[][] getBoard() { return board; }
public void set(int x, int y, boolean value) { board[x][y] = value; }
}
现在你的代码看起来像这样
Board board = new Board(3, 3);
Board nextBoard = new Board(3, 3);
nextBoard.set(1, 2, true); // the last element is 2 not 5
board.printBoard();
答案 4 :(得分:0)
每次需要将它传递给object时,你需要创建一个新的全新数组,以便对象看到一个新的数组,而不是相同的数组。