2010-05-15 22 views
1

我有點尷尬地問這個,因爲我應該知道更好,但這裏是我的。Java屬性和參考 - 我沒有得到我期望的結果

我有一個int「propertyAllowed」屬性的對象「投手」。我有一個具有「responsiblePitcher」屬性的對象Batter。我有一個對象隊有一個屬性「投手」。當面糊到達基地:

Batter.responsiblePitcher = Team.pitcher; 

這一切都很好,很好。然而,如果我們有一個投球變化而亞軍是在基地,我設置Team.pitcher一個新的投手:

Team.pitcher = new Pitcher(); 

...當然這改變Batter.pitcher的價值。

我應該如何做不同的事情,使Batter.responsiblePitcher屬性繼續指向讓他在基地上的投手,而不是指向Team.pitcher屬性中的哪一個?再次,我覺得我應該知道這已經...

謝謝。

+0

你不應該做任何事情。 Batter.reponsiblePitcher應保持它的價值...... – 2010-05-15 17:32:27

回答

2

...當然這會改變Batter.pitcher的價值。

這是不正確的。你的問題在別的地方。也許你實際上正在改變這樣的值:

Team.pitcher.changeSomeProperty(newValue); 

然後這確實會反映在其他引用,因爲它指向相同的實例。

Java是一個按值傳遞引用語言。下面的例子證明了這一點:

import java.util.Arrays; 

public class Test { 
    public static void main(String... args) { 
     String[] strings = new String[] { "foo", "bar" }; 
     changeReference(strings); 
     System.out.println(Arrays.toString(strings)); // still [foo, bar] 
     changeValue(strings); 
     System.out.println(Arrays.toString(strings)); // [foo, foo] 
    } 
    public static void changeReference(String[] strings) { 
     strings = new String[] { "foo", "foo" }; 
    } 
    public static void changeValue(String[] strings) { 
     strings[1] = "foo"; 
    } 
} 
+0

果然,你所描述的是正確的,Batter.responsiblePitcher保留了正確的價值。我在另一個地方錯誤地調整了responPitcher的屬性,並且這個問題從來沒有任何理由存在。 :P謝謝! – Blumer 2010-05-15 17:44:18

1

其實你的假設是不正確的。將Team.pitcher分配給新值不會改變Batter.pitcherBatter.pitcher仍然會指向舊的Pitcher實例。

原因是您正在爲對象分配引用,而不是對象本身。

相關問題