gpt4 book ai didi

java - 更改一个对象中的值会更改另一个对象中的值

转载 作者:行者123 更新时间:2023-11-30 05:42:06 24 4
gpt4 key购买 nike

我正在努力生成游戏树。

我遇到的问题是,当我将一个对象复制到新对象,然后在新对象中进行更改时,旧对象也会更改其值。

所以这似乎是一个引用问题。

但是我如何使新对象成为一个独立的实例。

创建从父对象复制的子对象后,然后更改子对象中的值,父对象也会更改,并且在方法结束时它将打印对象相等。

private void generateSubTree(State parent, int depth) {
if (depth == 0) {
System.out.println("End of leaf..!");
return;
}
ArrayList<State> listOfStates = GameEngine.legalMoves(parent);
for (State s: listOfStates) {
Board tempBoard = new Board(parent.getBoard().getBoard());
BoardPiece pieceRef = new BoardPiece();
State child = new State(parent);
if(parent.getTurn() == 0) {
pieceRef = GameEngine.checkForPiece(child.getPlayer1(), s.getMove().getFromX(), s.getMove().getFromY());
pieceRef.updatePosition(s.getMove().getToX(), s.getMove().getToY());
tempBoard.updateBoard(child.getPlayer1(), s.getMove(), false);
} else {
pieceRef = GameEngine.checkForPiece(child.getPlayer2(), s.getMove().getFromX(), s.getMove().getFromY());
pieceRef.updatePosition(s.getMove().getToX(), s.getMove().getToY());
tempBoard.updateBoard(child.getPlayer2(), s.getMove(), false);
}
child.setBoard(tempBoard);
parent.addChild(child);
System.out.println("Is parent equal to child: " + child.equals(parent));
i++;
System.out.println("States generated: " + i);
generateSubTree(child,depth-1);
}

}

public class State{

private Board board;
private int turn;
private Move move;
private ArrayList<Move> legalMoves;
private int depth;
private int utilityVal;
private Player player1;
private Player player2;

private State parent;
private ArrayList<State> children;

public State() {
children = new ArrayList<>();
}

// 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);
}

预期的结果是我可以更改对象 Child 而不更改 Parent

最佳答案

But how do I make the new object an independent instance.

删除static关键字,使对象内部的字段独立于其他对象。

如果字段/变量是静态,它将与该类的所有实例共享其值。如果更改其中之一,则会更改所有实例的值。

我认为主要问题是您对 State 对象的复制。您实际上并没有复制任何内容,只是将引用传递给另一个实例。

您需要一个 deepCopy 方法,该方法还可以复制所有字段的实例,而这些字段本身也必须复制它们自己。

必须在属于新对象的所有字段中进行深度复制。这里你必须复制BoardPlayerMove等等。对于原始数据类型,您的副本确实可以按原样工作。

关于java - 更改一个对象中的值会更改另一个对象中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com