Свойства и ссылки Java - я не получаю то, что ожидаю - PullRequest
1 голос
/ 15 мая 2010

Мне немного неловко спрашивать об этом, так как я должен знать лучше, но вот что у меня есть.

У меня есть объект "Pitcher" со свойством int в "runAllowed". У меня есть объект Batter, который обладает свойством «liabilityPitcher». У меня есть объект Team, у которого есть свойство «Кувшин». Когда тесто достигает базы:

Batter.responsiblePitcher = Team.pitcher;

Все это хорошо. Однако, если у нас есть изменение подачи, когда бегун находится на базе, я устанавливаю новый питчер в Team.pitcher:

Team.pitcher = new Pitcher();

... и, конечно, это меняет значение Batter.pitcher.

Как мне поступить иначе, чтобы свойство Batter.responsiblePitcher продолжало указывать на кувшина, который пустил его на базу вместо того, чтобы указывать на то, находится ли свойство Team.pitcher? Опять же, я чувствую, что должен знать это уже ...

Спасибо.

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

... и, конечно, это меняет значение 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";
    }
}
1 голос
/ 15 мая 2010

На самом деле ваше предположение неверно. Присвоение Team.pitcher новому значению не изменит Batter.pitcher. Batter.pitcher по-прежнему будет указывать на старый Pitcher экземпляр.

Причина в том, что вы назначаете ссылку на объект, а не на сам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...