Возможный дубликат:
Является ли Java "передачей по ссылке" ?
Может быть, я что-то упускаю... но я не могу понять, почему Java использует как передачу по значению, так и передачу по ссылке. Почему бы не использовать только одну парадигму?
Возможный дубликат:
Является ли Java "передачей по ссылке" ?
Может быть, я что-то упускаю... но я не могу понять, почему Java использует как передачу по значению, так и передачу по ссылке. Почему бы не использовать только одну парадигму?
Это не так. Java является исключительно передачей по значению. Значение, передаваемое при работе с объектом, является ссылкой на объект, но оно не имеет ничего общего с "передачей по ссылке".
Передача по ссылке означает, что функции можно передать переменную и изменить содержимое этой переменной в вызывающей функции. В Java такого нет.
Так, например:
void foo() {
int a;
a = 42;
bar(a);
System.out.println(a); // Will ALWAYS be 42
}
void bar(int b) {
b = 67;
}
В отличие от C++, в котором есть передача по ссылке:
// C++ code
void foo() {
int a;
a = 42;
bar(a);
cout << a; // 67?!
}
void bar(int& a) { // <== Note the &
a = 67;
}
Java не имеет эквивалента &
в C++ (или out
/ref
в C#).
Вы, вероятно, имеете в виду ссылки на объекты, которые представляют собой совершенно отдельное использование слова «ссылка», чем «ссылка» при передаче по ссылке. Давайте рассмотрим пример с объектами:
void foo() {
Object o1, o2;
o1 = new Object();
o2 = o1;
bar(o1);
System.out.println(o1 == o2); // Will ALWAYS be true
}
void bar(Object o) {
o = new Object();
}
Если бы в Java была передача по ссылке (и мы использовали ее для передачи объектной переменной в bar
), ==
в foo
было бы ложным. Но это не так, и нет никакого способа сделать это так.
Ссылка на объект позволяет вам изменить состояние объекта, переданного в функцию, но вы не можете изменить переменную, содержащую его, в вызывающей функции.
int[] x = {1}; passByRef(x);
.
- person Marko Topolnik; 19.12.2012
Java всегда "Передается по значению". Таким образом, примитивы, а также объект (reference) передаются по значению.
Изменить
Да, объекты не передаются напрямую, мы всегда ссылаемся на них по их ссылке. Таким образом, ссылка на объект передается по значению.