2012-04-03 79 views
-1

我在一個數組中作爲一個對象而不是單獨按預期工作的對象存在一些問題。例如Java類複製和數組

boardArray = new object[4]; 
workingBoardArray = new object[4]; 
boardArray[0] = new board(boardA); 
boardArray[1] = new board(boardB); 
boardArray[2] = new board(boardC); 
boardArray[3] = new board(boardD); 
int selectedBoard = selectBoard(boardArray); 
workingBoardArray[0] = boardArray[selectedBoard]; 
workingBoardArray[1] = boardArray[selectedBoard]; 
workingBoardArray[2] = boardArray[selectedBoard]; 
workingBoardArray[3] = boardArray[selectedBoard]; 
workingBoard[0].moveUp(); 
workingBoard[1].moveRight(); 
workingBoard[2].moveDown(); 
workingBoard[3].moveLeft(); 

此代碼創建一組4塊板,找到所期望的板,該複製板到工作板陣列,然後在新的方向移動每個工作板。問題是董事會一起行動。所以如果我在workingBoard [0]上執行moveUp(),workingBoard [1]也會向上移動。有沒有辦法解決這個問題,我覺得我錯過了一些基本的理解或一個非常愚蠢的錯誤。

我也嘗試過使用副本建築工像

workingBoard[0] = new Board(boardArray[selectedBoard].getBoard); 

它檢索所有必要的車載信息和與它創建了一個新的董事會,但似乎沒有什麼影響。任何幫助將是巨大的

+3

無法幫助,除非您發佈的板類的實現(如果它確實是一個類定義),如果它要成爲強制轉換爲接口至少讓我們看到了定義有一個執行的方法在 – 2012-04-03 10:57:02

+0

另外,對象的類之一,請張貼在那裏boardA,boardB等正在創建 – 2012-04-03 10:58:13

+0

是'workingBoardArray'和'workingBoard'的代碼相同?如果不是你在哪裏定義和初始化'workingBoard'? – assylias 2012-04-03 10:58:39

回答

7

看看這段代碼:

int selectedBoard = selectBoard(boardArray); 
workingBoardArray[0] = boardArray[selectedBoard]; 
workingBoardArray[1] = boardArray[selectedBoard]; 
workingBoardArray[2] = boardArray[selectedBoard]; 
workingBoardArray[3] = boardArray[selectedBoard]; 

這是設置所有四個數組元素是引用同一個對象。所以是的,當您通過調用moveUp()或其他任何方式修改該對象時,該更改通過數組中的所有元素可見。

聽起來好像你可能想每次創建一個副本。根據您的board類型(應遵循命名約定應該將其命名爲Board)的作用,您可能只需實施Cloneable(很可能會覆蓋clone()方法)或提供其他類型的複製操作。

你知道一個參考和Java中的對象之間的差異,並且該數組只包含引用,而不是對象? (同樣,任何變量值只會是一個引用而不是對象)。它真的是真的對了解對象如何在Java中工作很重要。例如:

StringBuilder a = new StringBuilder(); 
StringBuilder b = a; 
a.append("Foo"); 
System.out.println(b); // Still prints "Foo" 

在這裏,我們已經有了一個StringBuilder對象,即使有兩個變量(ab),其值指的是同一個對象。該板到工作板數組,然後

1

...副本轉移每個工作板在一個新的方向。

其實你不要抄板子。只有一個板子實例從workingBoardArray中被引用四次。要製作電路板的副本,您必須實施克隆方法或提供自定義複製方法。

例如如果實現了克隆方法,你可以寫:

workingBoardArray[0] = boardArray[selectedBoard].clone();