我理解Java是按值传递的,并且在将对象传递给函数时,只需将引用的值传递给函数/在其作用域之外。我也知道,你不能改变一个函数内的对象。据了解,您可以改变一个对象,其引用存储在两个不同的数据结构中,就像在C / C ++中一样吗?
例如
class ObjectReferences {
static HashMap<String, Object> map1 = new HashMap<String, Object>();
static HashMap<String, Object> map2 = new HashMap<String, Object>();
public static void addToBoth(Object o) {
map1.put("One",o);
map2.put("Two",o);
}
public static void main(String[] args) {
StringBuffer foo = new StringBuffer("wat");
addToBoth(foo);
map1.get("One").append("er");
System.out.println(map2.get("Two").toString());
}
}
根据我的推理,这应该打印出“水”。有人可以解释为什么这会在Java神秘的土地上有效吗?
答案 0 :(得分:2)
确定。因此,让我们首先纠正您的代码,使其工作(在Java 7+中),然后运行它:
import java.util.HashMap;
public class ObjectReferences {
static HashMap<String, StringBuffer> map1 = new HashMap<>();
static HashMap<String, StringBuffer> map2 = new HashMap<>();
public static void addToBoth(StringBuffer sb) {
map1.put("One",sb);
map2.put("Two",sb);
}
public static void main(String[] args) {
StringBuffer foo = new StringBuffer("wat");
addToBoth(foo);
map1.get("One").append("er");
System.out.println(map2.get("Two").toString());
}
}
按照预期打印water
。为什么?因为sb
方法中的addToBoth
引用完全相同的对象(StringBuffer
首次引用的唯一foo
),所以要向它添加内容并获取相同的对象以后会返回 - 同一个对象。 Java并没有神奇地复制对象内部(除非你克隆对象,但这是另一个故事)。
希望有所帮助。
P.S。你几乎已经编写了代码并且非常接近自己运行它。你的问题有进一步的背景吗?看来你自己可以回答它。