Ссылки на объекты передаются с помощью значения в Java, поэтому присвоение локальной переменной внутри метода не меняет исходную переменную. Только локальная переменная s
указывает на новую строку. Возможно, это будет легче понять с помощью небольшого рисунка ASCII.
Изначально у вас есть следующее:
------------
| nullTest |
------------
|
null
Когда вы впервые вводите метод setNotNull, вы получаете копию значения nullTest в 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, а не изменяете объект, на который указывает s.