我得到了这段代码,其中
call by Reference
必须用于每个方法调用,并且我必须以以下格式给出 a 的输出:
y:[result]; y: [result]; y:[result]; x:[result]; a:[result]
public class Main {
static int x = 2;
public static void main(String[] args) {
int[] a = {17, 43, 12};
foo(a[x]);
foo(x);
foo(a[x]);
System.out.println("x:" + x);
System.out.println("a:" + Arrays.toString(a));
}
static void foo(int y) {
x = x - 1;
y = y + 2;
if (x < 0) {
x = 5;
} else if (x > 20) {
x = 7;
}
System.out.println("y:" + y);
}
}.
我不能 100% 确定引用调用在某些情况下是如何工作的,并且我不确定哪个结果是正确的。
无论如何,这是一个:
foo(a[x])
用 a[2]
(即 12)调用。 y
变为 12 + 2 = 14。x
递减至 1。
foo(x)
用 x
(即 1)调用。 x
和y
都指向x
的值1。 x
递减至 0,然后 x
变为 3,因为 y=y+2
和 y
指向 x
的值 1。
foo(a[x])
用 a[3]
(不存在)调用。 x
减至 2。
数组
a
转换为 17,43,14
。
所以,结果会是这样的:
y : 14; y : 3; y : ?; x : 2; a : 17,43,14
我认为最让我困惑的是
foo(x)
的情况。 y
是否指向变量 x
或者调用该方法时 x
的值?
foo()
正在接受原语 int
按值,因此它是您传入的任何值的副本。没有引用。
无论
foo()
对y
做什么并不重要,该值不会反射回调用者。
此外,也不存在“指向某个值”这样的东西。您可以指向变量,但不能指向值。
然后
变为 3,因为x
和y=y+2
指向y
的值 1。x
用foo(a[x])
(不存在)调用。 `x 减至 2。a[3]
这是不正确的。变成 3 的是
y
,而不是 x
。此时 x
为 0。因此,后续对 foo(a[x])
的调用将使用 a[0]
来代替。