为了账号安全,请及时绑定邮箱和手机立即绑定

更改对象中的值会对另一个对象进行更改

更改对象中的值会对另一个对象进行更改

ibeautiful 2022-09-14 15:33:42
我正在努力生成一个游戏树。我输入的问题是,当我将一个对象复制到一个新对象,然后在新对象中进行更改时,旧对象也会更改它的值。所以这似乎是一个参考问题。但是,如何使新对象成为一个独立的实例。创建从父对象复制的此子对象,然后更改子对象中的值后,父对象也会更改,并且在方法的末尾,它将打印出对象相等。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<>();}}预期的结果是,我可以在不更改父项的情况下更改对象子项
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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

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

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

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

您需要一个方法,该方法还可以复制本身必须复制的所有字段的实例。deepCopy

必须在作为新对象一部分的所有字段中进行深度复制。在这里,您必须复制 , 的 , 等等。对于基元数据类型,您的副本可以按原样工作。BoardPlayerMove


查看完整回答
反对 回复 2022-09-14
?
潇潇雨雨

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;


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信