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