以下Java代码段来自AP计算机科学实践考试.
String s1 = "ab"; String s2 = s1; s1 = s1 + "c"; System.out.println(s1 + " " + s2);
此代码的输出在BlueJ上为“abc ab”.然而,其中一个可能的答案是“abc abc”.答案可以取决于Java是否将String引用设置为基元类型(按值)或类似对象(通过引用).
为了进一步说明这一点,我们来看一下原始类型的例子:
int s1 = 1; int s2 = s1; // copies value, not reference s1 = 42; System.out.println(s1 + " " + s2); // prints "1 42"
但是,说我们有BankAccount对象持有余额.
BankAccount b1 = new BankAccount(500); // 500 is initial balance parameter BankAccount b2 = b1; // reference to the same object b1.setBalance(0); System.out.println(b1.getBalance() + " " + s2.getBalance()); // prints "0 0"
我不知道Strings的情况如何.它们在技术上是对象,但是当将变量设置为彼此时,我的编译器似乎将它们视为基本类型.
如果Java传递像原始类型的String变量,答案是“abc ab”.但是,如果Java将String变量视为对任何其他Object的引用,则答案将为“abc abc”
你认为哪个是正确答案?
java字符串是不可变的,所以你的重新分配实际上导致你的变量指向一个新的String实例,而不是改变String的值.
String s1 = "ab"; String s2 = s1; s1 = s1 + "c"; System.out.println(s1 + " " + s2);
在第2行,s1 == s2 AND s1.equals(s2).在第3行连接后,s1现在引用不可变值“abc”的不同实例,所以s1 == s2和s1.equals(s2)也不同.
http://stackoverflow.com/questions/5835386/java-string-variable-setting-reference-or-value