2010-05-15 58 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实例。

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

相关问题