簡體   English   中英

用Java制作對象的副本

[英]Making copies of Objects in Java

我有這個Java代碼:

boolean[][] defaultBoard = {{false, false, false},
                            {false, false, false},
                            {false, false, false}};
Board board = new Board(defaultBoard);
Board nextBoard = new Board(defaultBoard);
nextBoard.getBoard()[1][5] = true;
board.printBoard();

printBoard

public void printBoard() {
    for (boolean row[] : board) {
        for (boolean cell : row) {
            System.out.print( cell ? "#" : "." );
        }
        System.out.println();
    }
    System.out.println();
}

但它回來了

...
.#.
...

這讓我覺得nextBoardboard都有相同的內存地址。 我的問題是:如何創建的副本nextBoard這樣當nextBoard編輯, board不編輯呢?

這不是boardnextBoard是相同的。 它是您傳遞給構造函數的defaultBoard數組。 您需要傳遞不同的數組。 否則,您只是修改同一個數組。

更好的是,為了確保Board實例始終包含一個新數組,我建議在構造函數中對數組進行深層復制。

數組是一個對象,因此您將傳遞對Board構造函數的引用。 由於您使用的是同一個數組,因此boardnextBoard共享同一個對象。 要避免這種情況,請使用clone方法。 這樣,您將獲得defaultBoard數組的副本以及每個具有自己的板的實例。 它看起來像這樣:

Board board = new Board(cloneBoard(defaultBoard));
Board nextBoard = new Board(cloneBoard(defaultBoard));

private boolean[][] cloneBoard(boolean[][] boardToClone) {
    boolean[][] clone = new boolean[boardToClone.length][];
    for(int i = 0; i < boardToClone.length; i++) {
        clone[i] = boardToClone[i].clone();
    }
    return clone;
}

使用.clone()方法,存在於任何Java Object子類中,即所有這些方法,就我所知。

在這種情況下,我會讓主板創建一個大小的陣列基礎

class Board {
    final boolean[] board;

    public Board(int width, height) {
        board = new[width][height];
    }

    public boolean[][] getBoard() { return board; }

    public void set(int x, int y, boolean value) { board[x][y] = value; }
}

現在你的代碼看起來像這樣

Board board = new Board(3, 3);
Board nextBoard = new Board(3, 3);
nextBoard.set(1, 2, true); // the last element is 2 not 5
board.printBoard();

每次需要將它傳遞給對象時,您需要創建一個新的新數組,以便對象看到一個新數組,而不是相同的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM