Ссылочный тип Java в параметре - PullRequest
2 голосов
/ 20 марта 2011

Почему это не меняет исходный объект:

public class Foo
{
 Bar item = new Item(5);

 public changeBar(Bar test){
  test = new Item(4);
 }

 public run(){

  changeBar(item);

 }
}

В этом случае item не изменяется.Как это возможно?Я имею в виду, что вы передаете ссылку как параметр в методе, поэтому я бы сказал, что присвоение ему нового значения означает, что начальное значение item также будет изменено.

Может кто-нибудь объяснить мне, какэто работает.

=============================================

однако, мой вопрос заключается в следующем:

следующее работает правильно?

public changeBar2(Bar test){
 test.parameter = "newValue";
}

Я не понимаю, как это отличается.

Ответы [ 5 ]

3 голосов
/ 20 марта 2011

Рассмотрим мысленный эксперимент:

changeBar(null);

Изменит ли ваш код выше значение null?

Ответ на ваш вопрос заключается в том, что хотя ваш Bar объект пройден«по ссылке», это отличается от передачи самой ссылки по значению.В Java все параметры передаются по значению, даже если они сами являются ссылками на другие объекты.

2 голосов
/ 20 марта 2011
 public changeBar(Bar test){
    test = new Item(4);
 }

 changeBar(item);

Здесь значение в item скопировано в test.Таким образом, на данный момент оба item, test указывают на один и тот же объект (ы).Внутри метода test указывает на другое местоположение, которое не влияет на item.Вы передаете по значению , а не по ссылке.


public changeBar2(Bar test){
   test.parameter = "newValue";
}

Вышеприведенный код изменяет передаваемый объект, так как test и item ссылаются натот же объект.

Таким образом, test может либо полностью указать на новый объект, либо изменить объект, на который ранее ссылался.Оба они разные и действительны.

1 голос
/ 20 марта 2011

Параметры в Java ВСЕГДА передаются по значению.

В начале функции changeBar () test является ссылкой на элемент, но затем вы перезаписываете его ссылкой на вновь созданный элемент.Поэтому вы перезаписываете только локальную переменную с другой ссылкой, но не изменяете ссылку на объект.

0 голосов
/ 20 марта 2011

Вы даете методу ссылку на этот объект, то есть, так сказать, на его адрес.Таким образом, этот адрес хранится в переменной с именем test.

. Затем ваш метод стирает то, что записано в переменной test, и вместо этого записывает адрес нового созданного им объекта Item.Ничто здесь не меняет ничего в отношении исходного Item объекта, а также на ссылки на него, которые находятся за пределами области действия метода.

Я предполагаю, что здесь я довольно приблизительный и буду рад исправить.

0 голосов
/ 20 марта 2011

test в changeBar в основном как указатель. Поэтому, когда вы назначаете его, вы меняете указатель.

Вот статья: http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

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