通过引用调用混淆

问题描述 投票:0回答:1

我得到了这段代码,其中

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
的值?

java reference pass-by-reference call-by-value
1个回答
0
投票

foo()
正在接受原语
int
按值,因此它是您传入的任何值的副本。没有引用。

无论

foo()
y
做什么并不重要,该值不会反射回调用者。

此外,也不存在“指向某个值”这样的东西。您可以指向变量,但不能指向值。

然后

x
变为 3,因为
y=y+2
y
指向
x
的值 1。

foo(a[x])
a[3]
(不存在)调用。 `x 减至 2。

这是不正确的。变成 3 的是

y
,而不是
x
。此时
x
为 0。因此,后续对
foo(a[x])
的调用将使用
a[0]
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.