Как я могу передать переменную по значению в Java? - PullRequest
2 голосов
/ 29 декабря 2011

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

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

Отсюда: В чем различия между PHP и Java?

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

Ответы [ 2 ]

5 голосов
/ 29 декабря 2011

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

 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 будет видно на месте вызова. Это - это манипуляция, которая торчит. Была передана ссылка на исходный объект. Для этого объекта был вызван установщик, поэтому получатель в месте вызова вернул бы новое значение bar.

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);
}

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

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

Имеет ли это смысл?

1 голос
/ 29 декабря 2011

Энтони Пеграм объяснил отлично.Я хотел бы добавить немного.

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

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

 foo = new Foo();

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

Спасибо

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