亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更改對象中的值會對另一個對象進行更改

更改對象中的值會對另一個對象進行更改

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 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號