【发布时间】:2018-07-04 14:39:34
【问题描述】:
一开始可能听起来很奇怪,可能看起来很简单,但我还是坚持了这一点。我认为在下面的代码中,text 被s 和t 引用,作为输出,我会得到hello world hello world,但不是。我得到hello world。
class Test2 {
private volatile static String text = "";
public static void main(String[] args) {
String s = text;
text = "hello world";
String t = text;
System.out.println(s + " " + t);
}
}
到目前为止,我错过了什么?我真的很困惑。大概在那里隐式地创建了一个新对象。但为什么呢?
以下不是相关的Java,而是C知识者。我尝试在 C 中解释上述代码。我在那里得到了预期的结果,hello world hello world。
#include <stdio.h>
int main()
{
char const volatile * volatile x = "";
char const volatile * volatile const * xPtr = &x;
x = "hello world";
char const volatile * volatile const * xPtr2 = &x;
printf("%s %s\n", *xPtr, *xPtr2);
return 0;
}
【问题讨论】:
-
Java 没有对引用的引用。它只有引用和原语。您可以通过在调试器中单步执行每行代码来准确了解每行代码的作用。
-
text = "hello world";不会改变text指向的对象的某些属性,但它会导致text指向一个全新的地方。您是否对"hello world"实际所做的/是什么感到困惑? -
简单地说:Java 中的“引用”更接近于 C/C++ 中的“指针”。它与 C++ 参考完全不同。
-
@snr ,我的错,我没有阅读所有 79 个答案,而是停止了 500 多个投票给出的好答案。如果你知道这个问题,你可能就知道答案了