递归和引用传递的参数

Recursion and parameters passed by reference

提问人:Tortoise 提问时间:6/30/2019 最后编辑:mjwillsTortoise 更新时间:6/30/2019 访问量:45

问:

有人可以用非常简单的术语解释为什么下面的代码输出 35 而不是 999,而数组本质上是通过引用传递的,而 temp[0] 是 999 并作为 num1 传递给 someFunction()。

公共类 TestB {

public static void main(String[] args)
{
    int[] num1 = {35};
    someFunction(num1, 3);     
    System.out.println(num1[0]);  //prints 35
}

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        int[] temp = {999};
        someFunction(temp, count-1);
    }
}

}

Java 递归 参数 按引用传递

评论

0赞 Bergi 6/30/2019
因为您重新分配了变量,而不是数组的元素。它不是通过引用,而是通过共享。temptemp[0]
0赞 Tortoise 6/30/2019
它就是 Java。当我通过算法进行跟踪时,在第二次调用时,num1[0] 是 999,并且一直持续到我返回 main。
0赞 MC Emperor 6/30/2019
Java 从来不是通过引用传递的。如果传递给方法(将其称为“method”而不是“function”),则引用的值将复制到第一个参数(该参数似乎具有相同的名称)。num1someFunctionsomeFunctions

答:

1赞 mjwills 6/30/2019 #1

someFunction不读取或写入参数。因此,根据定义,不能影响从 传入的数组。num1someFunctionnum1main

无论您选择的语言中的数组参数是通过引用还是按值传递,情况都是如此。

当我通过算法进行跟踪时,在第二次调用时,num1[0] 是 999 并一直持续到我回到主线。

我怀疑您对变量名称 in 和参数名称相同的事实感到困惑。您看到的是设置为特定值 - 但这不是 的 - 那是 的 。若要在调试时更清楚地说明这一点,请将其中一个的名称(变量名称 in 或参数名称 )改为 。mainsomeFunctionnum1mainnum1someFunctionnum1mainsomeFunctionbob

就您试图实现的结果而言,我怀疑,也许而不是:

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        int[] temp = {999};
        someFunction(temp, count-1);
    }
}

你可能想写:

public static void someFunction(int[] num1, int count){

    if (count!= 0){
        num1[0] = 999;
        someFunction(num1, count-1);
    }
}

特别要注意的是,(使用我建议的更改)将写入参数(传入的参数,而不是新数组) - 因此数组将反映该更改。someFunctionnum1tempmain

评论

0赞 Tortoise 6/30/2019
我明白你在说什么。您能简单地解释为什么当您跟踪呼叫 num1[0] 时会变成 999 吗?参数是否是每个调用的本地参数?
0赞 mjwills 6/30/2019
是 的 .将其中一个 s 的名称更改为 ,您将很快发现您的错误。num1someFunctionnum1num1bob
1赞 Tortoise 6/30/2019
啊,抱歉,我想你在上面回答了这一点。谢谢!