为什么我的Java方法不能更改传递的变量? [复制
-
28-09-2019 - |
题
这个问题在这里已经有一个答案:
- Java是“通过引用”或“通过价值传递”? 84个答案
当我看到以下代码无法正常工作时,我感到很困惑。
我认为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
指向一个新字符串。使用一些ASCII艺术可能会更容易理解。
最初您有这个:
------------
| nullTest |
------------
|
null
首次输入方法setNotnull时,您会得到一个 副本 nulltest in s
. 。在这种情况下
------------ ------------
| nullTest | | s |
------------ ------------
| |
null null
然后重新分配S:
------------ ------------
| nullTest | | s |
------------ ------------
| |
null "not null!"
然后离开该方法:
------------
| nullTest |
------------
|
null
其他提示
Java并未通过引用传递,它传递了参考的值。当您分配 s="not null"
, ,您正在重新分配该值。
我希望在不使用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());
这一切都很笨拙,可能不值得付出努力。
s =
这就是为什么。您正在分配给s,而不是修改指向的对象。
不隶属于 StackOverflow