Java拷贝构造函数不起作用

时间:2015-06-25 21:38:51

标签: java deep-copy

我已阅读很多关于复制构造函数的帖子,但我似乎无法让它工作。我调用了复制构造函数,但对象仍然修改了原始文件:

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对象?

2 个答案:

答案 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()