我今天遇到了这个,我无法理解正在发生的事情.
目的是创建一个可以更改参数对象的匿名方法.我虽然想出了一种智能的方法来传递值并在不同对象之间修改它们而没有对另一个对象的明确知识,但是有些事情是错误的.以下代码概述了一般问题:
void foo() {
String a = "foo";
MethodMap.addMethod("1", new Method() {
@Override
public void execute(Object ... args) {
args[0] = "bar";
}
} );
MethodMap.invoke("1", a);
System.out.println(a);
}
class MethodMap {
private static Map<String, Invocation> map = new HashMap<>();
public static boolean addMethod(String key, Invocation method) {
map.put(key, method);
}
public static void invoke(String key, Object ... args){
map.get(key).execute(args);
}
}
public interface Invocation {
public void execute(Object ... args);
}
Run Code Online (Sandbox Code Playgroud)
我的意图是这个代码应该输出bar,但它输出foo.我不太确定为什么.是不是通过引用传递了Java对象?在那种情况下,我不应该修改它们吗?
有人可以解释一下我错过了什么吗?
我对该领域术语的了解可能实际上限制了我在网上搜索这个术语的能力,因为我不知道谷歌会说些什么.
谢谢//西蒙
Java始终是按值传递的.除了在声明它的方法中重新分配局部变量之外,您根本无法更改局部变量指向的内容.与其他一些语言不同,您不能通过a"引用" 传递并使用另一种方法更新它指向的内容.
通过指定arg[0] = "bar",您可以将值成功分配给"bar"参数数组的第一个元素.但这对此没有影响a.
看到: