按参考对象与按值参照
我在这里阅读此评论:在Java中通过引用传递字符串?
是的,这是一种误解。 这是一个巨大的,广泛的误解。 它导致我讨厌的一个采访问题:(“Java如何传递参数”)。 我讨厌这个问题,因为大约一半的采访者似乎都想要错误的答案(“基于价值的原语,参考对象”)。 正确的答案需要更长的时间才能完成,而且似乎也混淆了其中一些问题。 他们不会相信:我发誓我没有通过技术筛选,因为CSMajor-type筛选器在大学里听到了这种误解,并将其视为福音。 FEH。 - - CPerkins 09年8月13日在14:34
有人可以解释一下,一个新的程序员可以掌握,说什么区别:
“在Java中,原语通过值传递,对象通过引用传递。”
和:
“在Java中,没有任何东西是通过引用传递的,引用是通过值传递的。”?
这些陈述在某种意义上是否属实? 我不想邀请喧哗的游行,但这听起来像是一个非常重要的概念,而我仍然不完全明白。
我相信这个误解是因为一个变量不能包含一个开头的对象 。 如果你掌握了这一点,那么显然变量只能包含对象(或原始值)的引用。 从那里到实现参考按值传递的步骤(就像原始值一样)非常小。
你可以做一个非常简单的测试来确定一种语言是否支持通过引用。 问问自己,你是否可以用这种语言编写交换功能,也就是说,可以这样工作
x == A, y == B
swap(x, y);
x == B, y == A
作为一名Java程序员,您很快意识到您无法在Java中实现此功能,因此您(正确地)得出了Java没有引用的结论。
回到你的句子:
这是错误的 。 我认为你只能传递变量中包含的东西,正如我上面所说的,一个变量不能包含一个对象,因此你不能在Java中传递一个对象。
这是真的 。
这样的事情在绘制时总是比较容易。 考虑以下两个变量,一个是原始类型,另一个是引用类型:
int i = 5;
String s = "test";
在内存的某处有一个i
看起来像这样的条目:
i
-----
| 5 |
-----
类似s
在内存中也有一个s
的入口,但是它引用堆中的一个位置,因为s
是引用类型变量,对象存储在堆中:
-----------
s |------->| "test" |
----- | |---------|
| --|--------------| | |
----- | |
| |
|---------|
所以s
的值是对那个坐在堆上的String对象的引用,所以如果将s
传递给一个方法:
printString(s);
public void printString(String arg)
{
System.out.println(arg);
}
实际被复制到arg
参数中的值是对堆中s
引用:
-----------
s |------->| "test" |<-----|
----- | |---------| |
| --|--------------| | | |
----- | | |
| | |
|---------| |
arg |
----- |
| --|-----------------------------------------
-----
希望这可以帮助。
好问题。 考虑下面的例子
void foo(Object obj) {
obj = new Foo();
}
Object o = new Bar();
foo(o);
// is o Foo or Bar?
pass by-reference
那么在调用foo
之后o
引用可能已经改变 foo
之后pass by-reference-by-value
引用o
不变