Почему мой метод Java не может изменить пропущенную переменную? [Дубликат
-
28-09-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
Я был вроде сбившись, когда увидел следующий код, не работал, как ожидалось.
Я думал, что Java всегда проходил переменные по ссылкам в функции. Поэтому, почему функция не может переназначить переменную?
public static void main(String[] args) {
String nullTest = null;
setNotNull(nullTest);
System.out.println(nullTest);
}
private static void setNotNull(String s) {
s = "not null!";
}
Эта программа выводит null
.
Решение
Ссылки на объекты передаются ценность В Java, поэтому назначение локальной переменной внутри метода не изменяет исходную переменную. Только локальная переменная s
указывает на новую строку. Может быть легче понять с небольшим аспииным искусством.
Первоначально у вас есть это:
------------
| nullTest |
------------
|
null
Когда вы впеьте введите метод Setnotnull, вы получаете Копия стоимости изнутри s
. Отказ В этом случае значение Nulltest - это нулевая ссылка:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null null
Затем переназначить S:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null "not null!"
А затем оставить метод:
------------
| nullTest |
------------
|
null
Другие советы
Java не передает ссылку, он проходит значение ссылки. Когда вы назначаете s="not null"
, Вы передаете эту ценность.
Я надеялся сделать что-то вроде setnotnull (myObject o) без использования o = setnotnull (o)
Просто, вы не можете. Самое близкое, что вы получите, это что-то подобное:
public class MyRef<T> {
private T obj;
public T get() {
return obj;
}
public void set(T obj) {
this.obj = obj;
}
public void setNotNull(T obj) {
if (this.obj == null) {
this.obj = obj;
}
}
}
MyRef<MyObj> ref = new MyRef<MyObj>();
ref.setNotNull(xyz);
System.err.println(ref.get());
Что все довольно неуклюже, и, вероятно, не стоит усилий.
s =
вот почему. Вы назначаете S, не изменяя объект, который указывает.