选择题
6. 有如下代码:
public class Test
{
public static void stringReplace(String text)
{
text=text+"c";
}
public static void bufferReplace(StringBuffer text)
{
text=text.append("c");
}
public static void main(String args[])
{
String textString=new String("ab");
StringBuffer textBuffer=new StringBuffer("ab");
stringReplace(textString);
bufferReplace(textBuffer);
System.out.pIintln(textString+textBuffer);
}
}
当编译并运行上面程序时,输出结果是______。
【正确答案】
C
【答案解析】 String和StringBuffer都是类,在方法调用的时候,二者传递的都是引用值(可以理解为传递的是它们的地址),对于String而言,由于String是不可变量,一旦赋值后,它的内容就不能被修改了。
从本质上来讲,引用传递是通过值传递实现的(传递了引用的值,或者可以理解为传递的是对象地址的值),对于本题而言,在调用stringReplace方法的时候,首先把实参textString的值复制给形参text(textString是字符串“ab”的引用,或者可以理解为是“ab”的地址),当在方法stringReplace内执行语句text=text+"c"的时候,相当于创建了一个新的字符串对象“abc”,然后text指向这个字符串对象,这并没有改变实参textString的值,因此,在调用结束后,textString指向的字符串的值还是“ab”。StringBuffer不是不可变量,在调用bufferReplace方法的时候,先把实参的值textBuffer赋值给形参text(字符串“ab”的引用,或可以理解为地址),在调用text.append("c")的时候,会直接对text指向的字符串后面拼接一个字符串“c”,由于text与textBuffer指向同一个字符串,因此,这个对形参的修改也会影响到实参的值,调用结束后textBuffer的值为“abc”。所以,选项C正确。