2 回答
TA贡献1852条经验 获得超7个赞
但是,如何使新对象成为一个独立的实例。
删除关键字可使对象内的字段独立于其他对象。static
如果字段/变量是,它将与该类的所有实例共享其值。如果更改其中一个实例,则会更改所有实例的值。static
我认为主要问题是你对对象的复制。您实际上并没有复制任何内容,只是将引用传递给另一个实例。State
您需要一个方法,该方法还可以复制本身必须复制的所有字段的实例。deepCopy
必须在作为新对象一部分的所有字段中进行深度复制。在这里,您必须复制 , 的 , 等等。对于基元数据类型,您的副本可以按原样工作。Board
Player
Move
TA贡献1833条经验 获得超4个赞
// Copy constructor
public State(State state) {
this.parent = state.parent;
this.depth = state.depth;
this.board = state.board;
this.children = state.children;
this.turn = 1 - state.turn;
this.player1 = state.player1;
this.player2 = state.player2;
// shallow copy
// this.subjects = student.subjects;
// deep copy - create new instance of HashSet
// this.subjects = new HashSet<>(state.subjects);
}
您的复制构造函数不会创建副本。您提供对另一个对象的引用,并且它们指向相同的父对象,深度,板,子对象等。您应该为每个对象创建另一个复制构造函数,直到基元类型。例如,如果电路板包含两个整数:
class Board {
int a;
int b;
public Board(Board board){
this.a = board.a;
this.b = board.b;
}
只需使用此构造函数:
this.board = new Board(state.board);
而不是:
this.board = state.board;
添加回答
举报