2013-01-18 31 views
3

我想提出一個RPG風格的節目,但我有麻煩讓我珍惜的對象數組工作。我想將我在陣列中找到的所有寶藏都保存下來,以後再打印出來。下面是寶類的代碼:對象失去了在陣列

private static int x = 0; 
Treasure treasureArray[] = new Treasure[20]; 

public void collectedTreasures(Treasure t){ 
treasureArray[x] = t; 
x++; 
} 

而在主程序:

GoldTreasure t = new Coin(); 
hero1.setPoints(t.getCoin()); 
t.collectedTreasures(t); 

寶對象的創建是一個無限循環內的開關內。 當我打印出來的數組,方法

public void printTreasures(){ 
     for (int y=0 ; y<x ; y++){ 
      System.out.print(treasureArray[y] + ", "); 

我只得到「空」爲儘可能多的寶物應該在數組中。如果我在t.collectedTreasures(t)之後打印出數組,那麼我看到只有最後一個寶藏存在,並且該對象之前的索引爲空。我做錯了什麼?

是的,我是一個新手。對人好點。

+4

你的變量'x'可能不應該是'static'。還要考慮像「Vector」這樣的動態列表。 – Sirko

+0

在'寶藏'類中定義了'treasureArray []'嗎?您可能有一個與每個「Treasure」對象關聯的單獨寶藏。 – mellamokb

+0

't.collectedTreasures(t);'看起來對我很可疑。我真的沒有花太多時間看你的代碼,但你真的添加自己? – mprivat

回答

6

此代碼是相當可疑:

GoldTreasure t = new Coin(); 
hero1.setPoints(t.getCoin()); 
t.collectedTreasures(t); 

這意味着你:

  1. 創建一個新的寶藏t;
  2. 呼籲對非常實例collectedTreasures

你應該把寶藏數組分配給英雄,而不是寶藏本身。

還要注意的是x不應該是一個靜態變量,因爲它將所有實例中得到共享;顯然不是你的意圖,因爲寶藏數組是每個實例。

+0

OP將終於以他們的第一場比賽狀態迴歸:) – mellamokb

+0

確實如此。靜態只是讓你更容易在你不應該的地方引用它。 – mellamokb

+2

謝謝!!!與英雄類中的數組一樣,現在就像魅力一樣。也不需要靜態x。 – SKR

0

的問題是,你收集本身的寶物,因爲你撥打對方付費功能 - 屬於一個寶藏 - 收集本身。

後來,當你調用哪個對象printTreasures它運行?你是否創建了一個新的寶藏實例並要求它打印它收集的內容?如果是這樣,結果是根據代碼,並沒有問題,但邏輯是錯誤的。

你應該做什麼:英雄是收集寶藏的人,因此在英雄課堂中移動珍寶,櫃檯和2個功能的定義 - 收集珍珠和印刷寶典。此外,讓X不是靜態的,因爲它的價值將在英雄之間分享。也許,更優雅的是,創建一個額外的班級來處理寶藏,並使用不同的課程組成你的英雄。

我可以建議對collectedTreasures一個renamig(寶物T)功能collectTreasure(寶物T)。

0

我們需要查看完整的代碼才能給出詳細的答案,但我懷疑你所做的是創建大量的Treasure子類,並在每個子類上調用collectedTreasure。這將每次增加您的全球x計數器,而每個個人treasureArray只有一個條目。

您可以將collectedTreasure方法移動到與你的hero1對象的類,在同一時間,擺脫靜態(全局)x變量,並用List實現替換您的Treasure對象數組(如ArrayList)他們都跟蹤自己的尺寸,所以你不必這樣做。加上你的代碼不會崩潰,當你得到超過20個寶藏!