【问题标题】:Need Assistance Understanding execution of Program [closed]需要帮助了解程序的执行[关闭]
【发布时间】:2013-05-04 07:21:35
【问题描述】:

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

【问题讨论】:

  • 查看变量范围并按值传递。
  • 向我们解释您所知道的以及您认为它应该如何工作。

标签: java arrays methods for-loop


【解决方案1】:

代码演示了(有效地)引用调用(在第一个增加方法中)和按值调用(在第二个增加方法中)之间的区别。事实上,这两种方法都使用按值调用,但在第一种情况下,值是对对象(数组)的引用,而在第二种情况下,是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) 的第二次调用中,我们没有传入数组,而是传入y[0](即1)。该方法增加变量y,但这在方法之外没有任何影响。在 Java 中,当您传递一个变量时,它是按值传递的,这实际上意味着传入了一个值的副本。对该值所做的任何更改都不会影响原始值。

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

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

【讨论】:

  • 非常感谢!!我设法理解了第一次调用 increase(x),但第二次调用 increase(int y) 真的让我很困惑。我现在明白了,肯定会一遍又一遍地重新阅读以完全理解它。再次感谢!
【解决方案2】:

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

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

因此,输出将是2 1

【讨论】:

    【解决方案3】:

    在 increase(x) 中,您传递了数组的引用,因此增量实际上是在增加实际值。在第二种情况下,您传递数组的特定值并增加它并不会真正影响数组中保存的值。欲了解更多信息,Check out the answer here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2012-11-17
      • 2014-07-03
      • 1970-01-01
      • 2018-08-28
      • 2012-12-21
      相关资源
      最近更新 更多