Способы передачи параметров в Java
public class PassBy {
public static void main(String[] args) {
int i = 0;
System.out.println(i); // 0
changeValue(i);
System.out.println(i); // 0
SuperInt si = new SuperInt(0);
System.out.println(si.i); // 0
changeValue(si);
System.out. println(si.i); // 10
}
public static void changeValue(int val) {
val = 10;
}
public static void changeValue(SuperInt val) {
val.i = 10;
}
static class SuperInt {
public int i;
public SuperInt(int i) {
this.i = i;
}
}
}
В языках программирования существует два основных способа передачи параметров в методы (или функции) — "по значению" и "по ссылке". Эти методы определяют, каким образом изменения, внесенные в параметр внутри метода, влияют на исходное значение аргумента, переданного методу. Рассмотрим оба способа более подробно.
- Передача параметра "по значению" (pass-by-value):
В этом способе исходное значение параметра не изменяется внутри метода. Метод работает с копией значения параметра. Это означает, что любые изменения, внесенные в параметр внутри метода, не отразятся на исходном значении, переданном методу. Параметры передаются "по значению" в большинстве простых типов данных. - Передача параметра "по ссылке" (pass-by-reference):
В этом случае метод получает не копию значения параметра, а ссылку на сам объект или переменную. Если метод изменяет значение параметра, это изменение отразится на исходном объекте или переменной, переданной методу. Параметры передаются "по ссылке" в языках программирования, поддерживающих ссылки на объекты, как например в языке C++ с использованием указателей.
Понимание разницы между передачей параметра "по значению" и "по ссылке" важно для правильной работы и отладки программ. В разных языках программирования могут быть разные правила для передачи параметров, поэтому важно знать, какой механизм используется в конкретном языке.
В Java передача всегда происходит "по значению", то есть содержимое переменной копируется при передаче в метод. Но важно понимать, что при передаче переменной ссылочного типа (любой не примитивный тип), скопируется именно ссылка на объект (а не сам объект) и соответственно в методе можно поменять сам исходный (переданный) объект.