我有点不好意思地问这个问题,因为我应该更了解,但这就是我所拥有的。

我有一个对象“ Pitcher”,其int属性为“ runsAllowed”。我有一个对象Batter,其属性为“ responsiblePitcher”。我有一个对象团队,其属性为“投手”。当击球手到达底数时:

Batter.responsiblePitcher = Team.pitcher;


一切都很好。但是,如果在跑垒员打球的时候我们改变了投球,我在Team.pitcher中设置一个新的投手:

Team.pitcher = new Pitcher();


...,当然这会更改Batter.pitcher的值。

我应该如何做些不同的事情,以使Batter.responsiblePitcher属性继续指向允许他作为基础的投手,而不是指向Team.pitcher属性中的投手?再次,我觉得我应该已经知道这一点...

谢谢。

最佳答案

...,当然这会更改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";
    }
}

10-08 17:03