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