变量无法更改

spr*_*ran 1 java

为什么变量s不会被2改变

public class Test {
  static void getVal(int s) {
    s= 2;
  }

  public static void main(String arg[]) {
    int s = 0;
    getVal(s);
    System.out.println(s);
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

正如Felix在评论中所说,在Java中,参数是通过值传递的.

如果我们使用不同的变量名称会更清楚:

public static void main(String arg[]) {
  int x = 0;
  method(x);
  System.out.println(x); // Prints 0
}

static void method(int y) {
  y = 2;
}
Run Code Online (Sandbox Code Playgroud)

当您调用时method(x),将x评估值,并且该值将成为其初始值y.这是两个变量之间的唯一联系.更改值y不会更改值x.

现在使用引用类型变量,它可能看起来好像不是这样:

public static void main(String arg[]) {
  StringBuilder x = new StringBuilder();
  method(x);
  System.out.println(x); // Prints "appended"
}

static void method(StringBuilder y) {
  y.append("appended");
}
Run Code Online (Sandbox Code Playgroud)

看起来有点像你已经改变了的价值x-但你真的没有.的价值观xy只是引用一个对象......都xy指向同一个对象,而append呼叫改变了对象中的数据.我喜欢在这里使用的类比是房子:作为方法来电者,我可以给你一张纸,上面写着我的地址.那个地址相当于参考,而我的房子就是对象.

你可以改变两件事:

  • 你可以把前门涂成红色,这样可以改变物体.我下次看房子时会看到这种变化.
  • 您可以更改写在纸上的地址.

这些都没有改变"我居住的地方" - 我对"我的房子"的引用的副本与以前一样,无论你做了什么.

当涉及到类时的行为导致了一个常见的神话,即"Java通过值传递原语并通过引用传递对象" - 这简直是不真实的.Java 按值传递所有参数 - 但您需要了解表达式的值始终是原始值或引用,而不是对象.