【发布时间】:2013-07-10 21:53:32
【问题描述】:
下面是让我困惑的程序。下面程序的输出是
The USA
main USA
如果我将所有 String 替换为 StringBuffer,那么我会得到
"The USA main The USA"。请帮助我理解这一点。
public class Confusing {
public static void sss(String s1){
s1= "The "+s1;
System.out.println(s1);
}
public static void main(String args[]){
String s1 = new String("USA");
sss(s1);
System.out.println("main "+s1);
}
}
【问题讨论】:
-
在
String的情况下,在sss中,您只能在sss的范围内修改s1。如果你使用StringBuffer,你会在StringBuffer中添加一些东西……这里的关键字是Java 中String的不变性…… -
好的,如果我把它设为“The”+s1;而不是 s1 = ""+s1;那么我们可以说它是由于不变性。无论如何,我在 StringBuffer 和 String 情况下都只传递引用“s1”。我还是很困惑。
-
但是你向 StringBuffer 对象添加了一些东西(我猜是 .append)。因为您只传递了对该对象的引用,所以此更改在
main中也可见。 -
所以你的意思是说如果我传递 String s1 那么我是通过值传递,如果我传递 StringBuffer s1 它是通过引用传递?
-
基本上,对于 StringBuffer,javac 将
=的语义与引用接收器抛出窗口并修改对象与修改引用。 (呻吟!)
标签: string object reference stringbuffer