2015-06-10 72 views
1

我想在Java中做這個小遊戲,但我似乎偶然發現了一個變量引用問題。 Player從中延伸的My Entity類保留了Dimension類型的變量。 這個尺寸得到通過實體類的構造函數設置如下所示:Java Pass-by-reference無法正常工作?

protected Dimension dimension; 

public Entity(Dimension dimension) { 
    this.dimension = dimension; 
} 

在我的播放器類,我這是怎麼通過他constructur通過維對象:

public Player(Dimension dimension) { 
    super(dimension); 
} 

我也有一個遊戲類,保留所有可能的維度,加上一個額外的變量,稱爲活動維度,它保持對活動遊戲維度的引用。

private Dimension activedimension; 
private Dimension overworld; 
private Dimension otherdimension; 

public Game() { 
    overworld = new OverWorldDimension(); 
    otherdimension = new OtherDimension(); 
    activedimension = overworld; 
} 

當我想要我的遊戲地圖尺寸復位,我用這個方法:

public void resetOverWorld() { 
    overworld = new OverWorldDimension(); 
    activedimension = overworld; 
} 

現在,每當我把這個resetOverWorld方法在任何地方,好像我activedimension真的刷新,但存儲在我的Player/Enitity類中的維度沒有。 我對Java相當陌生,所以我不知道我是否在通過構造函數和方法傳遞的變量引用時出錯。 我的應用程序似乎複製維度對象而不是傳遞參考,但我不知道在哪裏。

歡迎任何幫助或想法。 在此先感謝 〜Krikke

+4

設置這個新的參考實體類Java是按值傳遞。編輯:我沒有看到你更新Entity/Player類中的副本。你能證明這個代碼嗎? – markspace

+0

您正在重新分配您通過的參考。想象一下,你住在#5,你給每個人你的地址(通過參考),當他們寫你的地址時,你會得到這個職位(調用方法)。然後你偷偷搬家而不告訴任何人。你的帖子在哪裏去? –

+3

@Mike Java永遠不會被引用。它通過對象的值傳遞引用。 – Kyle

回答

3

問題是您沒有更新您的Player類中的參考。當您將Dimension存儲在您的Entity構造函數中時,您將在內存中存儲對該Dimension的引用。在您的resetOverWorld()方法中,您將overworldactivedimension變量更改爲指向新的OverWorldDimension,但其他地方的所有引用(例如您的Entity對象)均未發生更改。他們仍然參考他們構建的最初的Dimension

您可能需要考慮讓您的Entity可以容納的DimensionTracker類別允許您從一個位置更改它的內部Dimension。否則,您需要更新每個Entity以引用新的Dimension

public class DimensionTracker { 
    public Dimension dimension; 
    public DimensionTracker(Dimension d) { 
     dimension = d; 
    } 
} 

...

protected DimensionTracker dimensionTracker; 

public Entity(DimensionTracker dt) { 

    dimensionTracker = dt; 
} 

...

public Player(DimensionTracker dt){ 
    super(dt); 
} 

...

private DimensionTracker activedimension; 
private Dimension overworld; 
private Dimension otherdimension; 

public Game() { 
    overworld = new OverWorldDimension(); 
    otherdimension = new OtherDimension(); 
    activedimension.dimension = overworld; 
} 

...

public void resetOverWorld() { 
    overworld = new OverWorldDimension(); 
    activedimension.dimension = overworld; 
} 
+0

非常感謝!我試圖弄清楚現在有什麼地方出了問題。這個答案可以回答這一切!標記爲正確:) – Krikke93

0

不保存的參考變量遊戲地圖,但遊戲地圖的價值與此:

this.dimension = dimension; 

所以,你必須手動當更新實體參考遊戲中的參考變化,否則它會指向舊值,因爲它與變量上界無關。

0

您將尺寸對象傳遞給您的Player對象,並將對象的引用存儲在其某個字段中。

在您的Game對象中,您設置了activedimension來引用Dimension對象。通過更改其值,可以將其更改爲指向不同的Dimension對象。

即使activedimension用來指代你傳遞給Player相同Dimension對象,將其更改爲一個不同的Dimension對象不改變其對象Player被refered到。

考慮,如果系統啓動這樣的:

Game 
- activedimension --> Dimension object A 

Player 
- dimension --> Dimension object A 

更改Dimension object A將由PlayerGame對象都可以看到。

但是,將activedimension更改爲指向Dimension object B,完全不同的對象不會使dimension更改爲指向它。

Game 
- activedimension --> Dimension object A 

Player 
- dimension --> Dimension object B 
1
public void resetOverWorld() { 
    overworld = new OverWorldDimension(); 
    activedimension = overworld; 
} 

這隻會更新遊戲類變量private Dimension activedimension ;

調用resetOverWorld()後,你必須做一些像

entity.setDimension(activedimension)