即使使用复制构造函数,克隆对象也会更改原始对象[重复]

Posted

技术标签:

【中文标题】即使使用复制构造函数,克隆对象也会更改原始对象[重复]【英文标题】:Cloned object is changing original object even with using a copy constructor [duplicate] 【发布时间】:2016-01-10 12:49:56 【问题描述】:

我有一个名为stateState 对象。我试图通过调用函数applyMoveCloning() 来克隆它,该函数使用复制构造函数创建一个名为newState 的新State 对象。

public State applyMoveCloning(State oldState, Move move) 
    State newState = new State(oldState); // Calls copy constructor
    applyMove(newState, move);            // Calls applyMove() on the newState
    return newState;

这是我打电话给applyMoveCloning()的地方

State clonedState = game.applyMoveCloning(state, moves.get(i));

问题是,每当我对clonedState 进行更改时,它都会更改旧state 的属性,即使它们是不同的对象(一个只是与另一个具有相同的属性)

这是我的复制构造函数

public State(State another) 
    this.width = another.width;  
    this.height = another.height; 
    this.board = another.board; 

这怎么会发生?我不是用State newState = state;克隆的,所以我不明白。

【问题讨论】:

我应该展示什么类,实际上没有其他东西可以处理复制。 @PaulBoddington 是的,这是int[][] 告诉我们State。向我们展示它的字段。 嗯,这就是你的答案。数组是可变的。 嗯,我该如何解决这个问题,以便他们有单独的板? 【参考方案1】:

哪些属性会受到影响?

假设widthheight 是整数,它们是按值复制的,不太可能改变。

另一方面,board 看起来像一个引用,而您的克隆状态正在与旧状态共享它。

【讨论】:

我该如何解决它,那么他们都有单独的板? @Brejuro:您将不得不按值复制板 int[][] 数组值。

以上是关于即使使用复制构造函数,克隆对象也会更改原始对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

克隆 div 并删除类而不更改原始类

python 对象克隆

克隆一个 Jquery 可拖动对象也会拖动它的原始对象

克隆数组

克隆解析服务器对象

JS的深度克隆,利用构造函数原型深度克隆