0

我正在复习一个练习题,我只想知道程序如何得出答案的顺序---> 2 1 我在理解主驱动程序调用时遇到了困难。我了解这些方法的用法。

代码是:

public class Test {
  public static void main(String[] args) {
    int[] x = {1, 2, 3, 4, 5};
    increase(x);

    int[] y = {1, 2, 3, 4, 5};
    increase(y[0]);
    System.out.println(x[0] + " " + y[0]);
  }
  public static void increase(int[] x) {
    for (int i = 0; i < x.length; i++)
      x[i]++;
  }
  public static void increase(int y) {
     y++;
  }
}
4

3 回答 3

4

该代码演示了(有效地)按引用调用(在第一个增加方法中)和按值调用(在第二个增加方法中)之间的区别。事实上,这两种方法都使用按值调用,但在第一种情况下,值是对对象(数组)的引用,而在第二种情况下是一个int(来自数组的单个值)。

该代码int[] x = {1, 2, 3, 4, 5}创建一个数组。当您调用 increase(x) 时,您正在调用第一个 increase 方法。该方法遍历数组的元素并递增每个元素。该行x[i]++相当于x[i] = x[i] + 1。结果被存储回数组。在此调用结束时,数组现在包含{2, 3, 4, 5, 6}. 因此x[0]2

在第二次调用中,increase(int y)我们不传入数组,而是传入 (ie )的。该方法增加变量,但在方法之外没有影响。在 Java 中,当您传递一个变量时,它是按值传递的,这实际上意味着传入了该值的副本。对该值所做的任何更改都不会影响原始值。y[0]1y

当您传入数组时,您会传递对数组对象的引用。引用不能改变,但对象的内容(数组的内容)可以改变。

我不得不承认这有点令人困惑,但重新阅读我写过的内容几次,希望你能明白!

于 2013-05-09T18:16:42.257 回答
1

Java 方法接收您传入的值的副本(如果是原始类型)或引用的副本(如果是对象类型)。increase(int[])接受一个数组(这是一个引用类型),并递增该数组中的每个值。该方法接收您的数组引用的副本,并且不会更改它。它只是递增数组中的每个元素,这与您发送的数组相同。

有了increase(int)它有点不同。该y变量是您传入的值的副本。当您增加 时y,您只是在增加该副本。原始值不变。所以表面上是你传入的值实际上并没有改变。

因此,输出将是2 1

于 2013-05-09T18:12:39.187 回答
0

在 increase(x) 中,您正在传递数组的引用,因此增量实际上是在增加实际值。在第二种情况下,您传递数组的特定值并增加它并不会真正影响数组中保存的值。有关更多信息,请在此处查看答案

于 2013-05-09T18:15:44.177 回答