2011-12-29 3 views
2

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

Все параметры метода передаются по значению в Java. Однако, поскольку все объекты фактически являются ссылками, вы передаете значение ссылки при передаче объекта. Это означает, что если вы манипулируете объектом , переданным в метод, манипуляции будут придерживаться.

Отсюда: What are the differences between PHP and Java?

Что это значит? Означает ли это, что foo=blah в Java похож на $foo=&$blah на PHP? Как передать значение Java?

+0

Вот пример того, как это работает: http://stackoverflow.com/questions/5222/accessing-post-variables-using-java-servlets – Michael

+1

Там нет «пройти по ссылке» в Java. Java всегда ** ** pass-by-value. http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

+0

Я бы прочитал [Стратегия оценки] (http://en.wikipedia.org/wiki/Evaluation_strategy). Хотя Java реализует только «call-by-value», * семантика * передаваемых значений объекта может пониматься как «вызов по-объекту». (Фактически: когда вы передаете объект, вы передаете * этот * объект, а не копию.) В Java полностью отсутствует концепция ссылок на переменные, которые имеет PHP, которые похожи, но отличаются от 'call-by-reference'. –

ответ

5

Что это означает, учитывая

class Foo { 
    private int bar; 

    public void setBar(int value) { 
     bar = value; 
    } 

    public int getBar() { 
     return bar; 
    } 
} 

И

public void doSomethingToFoo(Foo foo) { 
    foo.setBar(42); 
} 

Переход к bar будет видна на callsite. Это - манипуляция которая придерживается. Ссылка на исходный объект была передана. Для этого объекта был выведен сеттер, поэтому получатель на call-сайте вернет новое значение бара.

Foo foo = new Foo(); 
doSomethingToFoo(foo); 
int bar = foo.getBar(); // gets 42 

Однако, учитывая

public void doSomethingElseWithFoo(Foo foo) { 
    foo = new Foo(); // assigning new instance to variable 
    foo.setBar(117); 
} 

Это изменение не быть видны на callsite, как foo переменной внутри метода был переназначен. Ссылка была просто передана по значению, переменные на самом деле не связаны или связаны каким-либо образом, они просто имели значение (ссылку). Теперь мы перезаписали ссылку, содержащую одну переменную внутри метода, переменная в callsite имеет ту же ссылку, что и раньше.

Foo foo = new Foo(); 
foo.setBar(7); 
doSomethingElseWithFoo(foo); 
int bar = foo.getBar(); // still is 7! 

Это имеет смысл?

1

Энтони Пегем прекрасно объяснил. Хотелось бы добавить немного.

Вы никогда не сможете передать объект по значению.

В java каждый объект создается в куче. У вас есть ссылка или то, что мы можем сказать, что лестница подходит к объекту. В случае вызова функции вы передаете ссылку (по значению) в качестве параметра. Итак, у вас есть другая ссылка или лестница, идущая к одному и тому же объекту в вашей функции. Вы можете перейти к объекту по этой ссылке и изменить его. Теперь, если вы измените ссылку в вашей функции, как Энтони сделал

foo = new Foo(); 

то, что происходит, вы только что создали новый объект в куче, и у вас есть ссылка на этот object.In этого шага, вы заменить существующие ссылки (Ссылка на старый объект) ссылкой на вновь созданный объект.Таким образом, в вашей функции вы потеряли путь к старому объекту. Теперь, если вы внесете какие-либо изменения, вы меняете вновь созданный объект, а не объект функции вызывающего.

Благодаря

+0

Хороший ответ. Просто, чтобы вы знали, во всем мире вспыхнули войны о том, являются ли параметры Java с ссылочным типом передачей по ссылке объектов или пошаговой ссылкой. Мне легче всего избежать этого аргумента, если вы не можете ответить на вопрос, не вставая на сторону. –

Смежные вопросы