即使使用复制构造函数,克隆对象也会更改原始对象[重复]
Posted
技术标签:
【中文标题】即使使用复制构造函数,克隆对象也会更改原始对象[重复]【英文标题】:Cloned object is changing original object even with using a copy constructor [duplicate] 【发布时间】:2016-01-10 12:49:56 【问题描述】:我有一个名为state
的State
对象。我试图通过调用函数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】:
哪些属性会受到影响?
假设width
和height
是整数,它们是按值复制的,不太可能改变。
另一方面,board
看起来像一个引用,而您的克隆状态正在与旧状态共享它。
【讨论】:
我该如何解决它,那么他们都有单独的板? @Brejuro:您将不得不按值复制板 int[][] 数组值。以上是关于即使使用复制构造函数,克隆对象也会更改原始对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章