提问人:xjqing 提问时间:7/31/2023 最后编辑:Progmanxjqing 更新时间:7/31/2023 访问量:47
关于在两个函数之间传递参数的问题 [重复]
questions about the pass of parameters between two functions [duplicate]
问:
我对两个函数之间的参数传递感到困惑,这里有两个结果相反的例子:
示例 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);
}
}
提前非常感谢
我试图比较上面提到的这两个例子。但是,我仍然感到困惑,为什么它们会产生完全不同的结果。
答:
-2赞
R Z
7/31/2023
#1
在 Java 中,基元类型(包括 )是按值传递的,这意味着它们不能被其他方法修改。类类型(包括 )是通过引用传递的,这意味着它们可以通过其他方法进行修改。(正如@WJS所指出的,列表不能直接修改,只能修改其内容,所以这有时被称为“共享调用”,但非常相似)boolean
List
评论
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!)是,它使参数传递与赋值相同,并且类似于与“==”等的比较。
评论