关于在两个函数之间传递参数的问题 [重复]

questions about the pass of parameters between two functions [duplicate]

提问人:xjqing 提问时间:7/31/2023 最后编辑:Progmanxjqing 更新时间:7/31/2023 访问量:47

问:

我对两个函数之间的参数传递感到困惑,这里有两个结果相反的例子:

示例 1: 如果我运行下面的 java 代码,它将在控制台上打印 false。根据我的理解,它与函数范围有关,因此称为 flag 的变量在 main 函数中保持不变。而调用 dfs 的函数不能从 main 函数中更改变量。

class HelloWorld {
    public static void main(String[] args) {
        boolean flag=false;
        dfs(flag);
        System.out.println(flag); //this prints false
    }
    
    public static void dfs(boolean flag){
        flag=true;
    }
}

示例 2: 下面的代码是 leetcode 17(即 https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/)的解决方案,我的问题是为什么这里称为组合的变量会在 main 函数中更改(这里的组合充当容器来存储所有令人满意的结果)?为什么名为 doCombination 的函数可以更改 main 函数中的变量?

private static final String[] KEYS = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

public List<String> letterCombinations(String digits) {
    List<String> combinations = new ArrayList<>();
    if (digits == null || digits.length() == 0) {
        return combinations;
    }
    doCombination(new StringBuilder(), combinations, digits);
    return combinations;
}

private void doCombination(StringBuilder prefix, List<String> combinations, final String digits) {
    if (prefix.length() == digits.length()) {
        combinations.add(prefix.toString());
        return;
    }
    int curDigits = digits.charAt(prefix.length()) - '0';
    String letters = KEYS[curDigits];
    for (char c : letters.toCharArray()) {
        prefix.append(c);                         
        doCombination(prefix, combinations, digits);
        prefix.deleteCharAt(prefix.length() - 1); 
    }
}

提前非常感谢

我试图比较上面提到的这两个例子。但是,我仍然感到困惑,为什么它们会产生完全不同的结果。

java 参数传递 深度优先搜索 回溯

评论


答:

-2赞 R Z 7/31/2023 #1

在 Java 中,基元类型(包括 )是按值传递的,这意味着它们不能被其他方法修改。类类型(包括 )是通过引用传递的,这意味着它们可以通过其他方法进行修改。(正如@WJS所指出的,列表不能直接修改,只能修改其内容,所以这有时被称为“共享调用”,但非常相似)booleanList

评论

1赞 WJS 7/31/2023
实际上,只能修改内容,而不能修改实际引用本身。List
0赞 xjqing 7/31/2023
谢谢你的回复,这很有意义!谢谢!!!
0赞 Seelenvirtuose 7/31/2023
哎哟!Java 始终是按值传递的。
0赞 R Z 7/31/2023
@Seelenvirtuose 即使这在技术上是正确的,它对于描述Java的行为也没有用,因为引用是隐式的。如果想要精确度,只需使用共享调用或其他等效术语即可。
0赞 Arfur Narf 7/31/2023
关于Java是按值传递还是按引用传递的喋喋不休似乎大多是毫无意义的“针尖上的天使”,因为无可辩驳的是,被调用的例程获得了对(非原始)对象的引用。但是,支持将其视为按值传递(引用)的一个论点(ha!)是,它使参数传递与赋值相同,并且类似于与“==”等的比较。