Java 对象引用传递与。 C++ 内存引用传递

Java Object Reference Passing Vs. C++ Memory Reference Passing

我理解 Java 是按值传递,当将对象传递给函数时,您只需将引用的值传递给 function/outside 其范围。我也知道,您不能在函数内更改对象。据了解,您能否像在 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());
    }
}

根据我的推理,这应该打印出 "water"。有人可以解释为什么这在 Java 的神秘土地上行得通或行不通吗?

好的。因此,让我们首先更正您的代码,使其工作(在 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。为什么?因为 addToBoth 方法中的 sb 引用完全相同的对象(唯一的 StringBuffer 首先被 foo 引用),所以向它附加一些东西并获得相同的对象稍后将 return - 相同的对象。 Java 不会神奇地复制对象内部结构(除非您克隆对象,但那是另一回事)。

希望对您有所帮助。

P.S。您几乎已经编写了代码,并且非常接近 运行 亲自编写代码。你的问题有进一步的背景吗?看来你可以自己回答。