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

我正在努力生成一个游戏树。


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


所以这似乎是一个参考问题。


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


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


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<>();

}


}

预期的结果是,我可以在不更改父项的情况下更改对象子项


ibeautiful
浏览 166回答 2
2回答

慕姐4208626

但是,如何使新对象成为一个独立的实例。删除关键字可使对象内的字段独立于其他对象。static如果字段/变量是,它将与该类的所有实例共享其值。如果更改其中一个实例,则会更改所有实例的值。static我认为主要问题是你对对象的复制。您实际上并没有复制任何内容,只是将引用传递给另一个实例。State您需要一个方法,该方法还可以复制本身必须复制的所有字段的实例。deepCopy必须在作为新对象一部分的所有字段中进行深度复制。在这里,您必须复制 , 的 , 等等。对于基元数据类型,您的副本可以按原样工作。BoardPlayerMove

潇潇雨雨

&nbsp; &nbsp; // Copy constructorpublic State(State state) {&nbsp; &nbsp; this.parent = state.parent;&nbsp; &nbsp; this.depth = state.depth;&nbsp; &nbsp; this.board = state.board;&nbsp; &nbsp; this.children = state.children;&nbsp; &nbsp; this.turn = 1 - state.turn;&nbsp; &nbsp; this.player1 = state.player1;&nbsp; &nbsp; this.player2 = state.player2;&nbsp; &nbsp; // shallow copy&nbsp; &nbsp; // this.subjects = student.subjects;&nbsp; &nbsp; // deep copy - create new instance of HashSet//&nbsp; this.subjects = new HashSet<>(state.subjects);}您的复制构造函数不会创建副本。您提供对另一个对象的引用,并且它们指向相同的父对象,深度,板,子对象等。您应该为每个对象创建另一个复制构造函数,直到基元类型。例如,如果电路板包含两个整数:class Board {int a;int b;public Board(Board board){&nbsp; &nbsp;this.a = board.a;&nbsp; &nbsp;this.b = board.b;}只需使用此构造函数:this.board = new Board(state.board);而不是:this.board = state.board;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java