当我看到以下代码没有按预期工作时,我感到很困惑。
我认为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
。
答案 0 :(得分:21)
对象的引用由Java中的 value 传递,因此分配给方法内的局部变量不会更改原始变量。只有局部变量s
指向新字符串。用一点ASCII艺术可能更容易理解。
最初你有这个:
------------
| nullTest |
------------
|
null
当您第一次输入方法setNotNull时,您会在s
中获得nullTest值的副本。在这种情况下,nullTest的值是空引用:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null null
然后重新分配s:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null "not null!"
然后离开方法:
------------
| nullTest |
------------
|
null
答案 1 :(得分:2)
Java不通过引用传递,它传递引用的值。在分配s="not null"
时,您将重新分配该值。
答案 2 :(得分:1)
我希望在不使用o = setNotNull(o)的情况下执行类似setNotNull(MyObject 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());
这一切都相当笨重,可能不值得努力。
答案 3 :(得分:0)
s =
这就是原因。你正在分配给s,而不是修改s指向的对象。