需要帮助了解程序的执行情况

时间:2013-05-09 18:05:59

标签: java arrays methods for-loop

我正在审查一个练习题,我只想知道程序是如何得出答案的顺序---> 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++;
  }
}

3 个答案:

答案 0 :(得分:4)

代码演示了(有效地)引用调用(在第一个增加方法中)和按值调用(在第二个增加方法中)之间的差异。实际上,两种方法都使用call-by-value,但在第一种情况下,value是对对象(数组)的引用,在第二种情况下是int(来自数组的单个值)。

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

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

传入数组时,传递对数组对象的引用。无法更改引用,但可以更改对象的内容(数组的内容)。

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

答案 1 :(得分:1)

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

increase(int)它有点不同。 y变量是您传入的值的副本。当您递增y时,您只是递增该副本。原始值不会更改。所以外观是你传入的值实际上没有改变。

因此,输出将是2 1

答案 2 :(得分:0)

在增加(x)中,您传递的是数组的引用,因此增量实际上增加了实际值。在第二个实例中,您传递的是数组的特定值,并且增加它并不会真正影响数组中保存的值。有关详细信息,请Check out the answer here