Java对象引用传递Vs. C ++内存参考传递

时间:2016-08-08 21:22:23

标签: java pass-by-reference

我理解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神秘的土地上有效吗?

1 个答案:

答案 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。你几乎已经编写了代码并且非常接近自己运行它。你的问题有进一步的背景吗?看来你自己可以回答它。