这个问题在这里已经有一个答案:

当我看到以下代码无法正常工作时,我感到很困惑。

我认为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,而不是修改指向的对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top