为什么我的Java方法不能改变传递的变量?

Wil*_*ill 7 java variables null pass-by-reference pass-by-value

当我看到以下代码没有按预期工作时,我有点困惑.

我认为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!";
}
Run Code Online (Sandbox Code Playgroud)

该计划输出null.

Mar*_*ers 21

对象的引用在Java 中通过传递,因此分配给方法内的局部变量不会更改原始变量.只有局部变量s指向一个新字符串.用一点ASCII艺术可能更容易理解.

最初你有这个:

------------
| nullTest |
------------
     |
    null
Run Code Online (Sandbox Code Playgroud)

当您第一次输入方法setNotNull时,您将获得nullTest 的副本s.在这种情况下,nullTest的值是一个空引用:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null            null
Run Code Online (Sandbox Code Playgroud)

然后重新分配s:

------------    ------------
| nullTest |    |    s     |
------------    ------------
     |               |
    null         "not null!"
Run Code Online (Sandbox Code Playgroud)

然后离开方法:

------------
| nullTest |
------------
     |
    null
Run Code Online (Sandbox Code Playgroud)