【问题标题】:Java copy constructor not workingJava复制构造函数不起作用
【发布时间】:2015-06-25 21:38:50
【问题描述】:

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

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;
    }
    [...]
}

该类对Square 类型的六乘六板进行建模。 Square 是一个对象,可以容纳一个或多个 Piece 类型的对象。

我怎样才能拿走我的原始板并制作它的精确副本,以便我可以在不接触原始Board 对象的情况下从Squares 添加和删除Pieces?

【问题讨论】:

  • 显然您的getSquare 方法从originalBoard 返回Square 实例。您还应该为每个 Square 实例创建一个副本。
  • 问题的标签表明你需要做深拷贝

标签: java deep-copy


【解决方案1】:

您的深层副本不够深入。您已经创建了自己的 2D Square 数组,但该数组与 originalBoard 引用的 Square 对象相同。

您需要复制您从originalBoard 获得的Square 对象。根据 Square 对象所包含的内容,您需要在复制构造函数中复制其属性(例如 Piece)。

【讨论】:

    【解决方案2】:

    由于您使用的是Objects (Square) 而不是原语,因此通过关联matrix[row][col] = originalBoard.getSquare(row, col);,您将获得对象的引用,任何修改都会改变这两个引用。

    如果您想复制确切的状态并进行修改,那么您应该在 Square 类中实现 Cloneable,并在关联到复制数组时调用 clone()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2015-06-14
      • 2015-07-04
      • 2017-07-28
      • 2021-12-08
      • 2015-11-02
      • 2011-07-17
      相关资源
      最近更新 更多