Все в Java передается по значению. Однако, если вы передаете ссылку, это значение ссылки.
Поскольку методы Java не могут попасть в стек вызывающей стороны для переназначения переменных, ни один вызов метода не может изменить идентичность ссылки (адреса) там. Это то, что мы имеем в виду, когда говорим, что Java не передается по ссылке. Это отличается от C ++ (и аналогичных языков), что допускает это в некоторых случаях.
Теперь давайте посмотрим на некоторые эффекты.
Если я это сделаю:
Object[] o = ...
mutateArray(o);
содержимое впоследствии может быть другим, поскольку все, что нужно mutateArray
, - это адрес массива, чтобы изменить его содержимое. Однако адрес o
будет таким же. Если я сделаю:
String x = "foo";
tryToMutateString(x);
адрес x
снова тот же после. Поскольку строки неизменяемы, это означает, что они также будут "foo"
.
Чтобы изменить объект, нужно изменить его содержимое (например, успешно изменить последний элемент o
или попытаться изменить последнюю букву «foo» на «d»). Это не следует путать с переназначением x
или o
в стеке вызывающего абонента (невозможно).
Раздел Википедии о вызове с помощью общего доступа может пролить дополнительный свет.