无法复制我的对象并更改值

时间:2014-12-31 01:48:16

标签: java object

我在制作要使用的对象的副本并更改该副本的值时遇到问题,而是更改了我的两个对象的值。对象的代码。

public class Board {
    private int[][] board;

    public Board() {
        board = new int[9][9];
    }
    public Board(int[][] layout){
        board = layout;
    }

    public int[][] getBoard(){
        return board;
    }
    public int getBoardValue(int y, int x){
        return board[y][x];
    }
    public void insertValue(int v, int y, int x){
        board[y][x] =v;
    }
}

我试图开始工作的函数的代码

public Board copy(Board b) {
    Node node = new Node(b);
    int[][] layout = node.getBoard().getBoard();
    Board temp = new Board(layout);
    temp.insertValue(1,4,5);
    return temp;
}

因此,当我尝试在新对象中插入值1时,旧对象仍会更改。

3 个答案:

答案 0 :(得分:3)

public Board(int[][] layout){
  board = layout;
}

这使得电路板和布局指向同一地址。尝试类似:

public Board(int[][] layout){
  this();
  for(int i=0; i<layout.length;i++)
   for(int j=0; j<layout[0].length;j++)
      board[i][j] = layout[i][j];
}

答案 1 :(得分:2)

将数组变量分配给现有数组时,不会获得新数组。你得到两个对同一个数组的引用。

例如:

int[] a = { 1, 2, 3};
int[] b = a;

ab不是两个数组,而是对同一个数组的两个引用。随后更改a与更改b相同。

对于2D数组,还有另一个问题:数组int[][] x实际上是一个包含其他数组序列的数组。因此,它的一个天真副本(int[][] y = x.clone())将为您提供两个int[][]数组,其中包含对int[]数组序列的共享引用。

要正确复制2D数组,需要复制其中的各个1D数组。

-

在您的情况下,两个对象都持有对同一数组的引用。如果您希望它们具有单独的阵列,则需要复制该阵列。您可以在构造函数中复制数组,如下所示:

public Board(int[][] layout) {
    board = new int[layout.length][];
    for (int i = 0; i < layout.length; ++i) {
        board[i] = layout[i].clone();
    }
}

答案 2 :(得分:1)

您还必须复制layout数组。

public Board copy(Board b) {
    Node node = new Node(b);
    int[][] oldLayout = node.getBoard().getBoard();
    int[][] newLayout = new int[9][9];
    for(int i=0; i<newLayout.length; i++) {
        newLayout[i] = Arrays.copyOf(oldLayout[i], oldLayout[i].length);
    }
    Board temp = new Board(newLayout);
    temp.insertValue(1,4,5);
    return temp;
}