日期:2014-05-20 浏览次数:20881 次
public static void main(String[] args) { StringBuffer str1 = new StringBuffer("hello"); test(str1); System.out.println("main : " + str1); } public static void test(StringBuffer str) { StringBuffer tempStr = new StringBuffer(); System.out.println("first : " + str); str = str.append(" world"); System.out.println("second: " + str); str = tempStr; System.out.println("third : " + str); }
public static void test(StringBuffer str) { StringBuffer tempStr = new StringBuffer(); //构造一个tempStr的StringBuffer对象 System.out.println("first : " + str);//输出str,没有问题,肯定是hello str = str.append(" world");//在hello后面连接" world",并重新赋值给str,所以str现在是"hello world" System.out.println("second: " + str); //输出"hello world" str = tempStr; //将str指向tempStr,注意这里的str直接赋值和前面append的区别,append //能改变这个str对象,而str这个形式参数只是指向了tempStr空间,一旦方法结束,str还是原来的str, //也就是append之后的那个str "hello world" System.out.println("third : " + str); }
------解决方案--------------------
[code=Java][/code]
public static void main(String[] args)
{
StringBuffer str1 = new StringBuffer("hello");
test(str1);
System.out.println("main : " + str1);
}
public static void test(StringBuffer str)
{
StringBuffer tempStr = new StringBuffer();
System.out.println("first : " + str);
str = str.append(" world");
System.out.println("second: " + str);
str = tempStr;
System.out.println("third : " + str);
}
[code=Java][/code]
请记住Java中函数永远是值传递的。
StringBuffer str1 = new StringBuffer("hello");
在堆内存声明了一个StringBuffer实例,传入参数“hello”。test()方法调用时,str1在栈内存中的对象引用被赋值给局部变量str,此时str和str1指向堆内存中的同一个StringBuffer对象。
接着输出str(同str1),结果是:hello;
append()将world追加到str(str1)变量所指向的StringBuffer中。注意由于str1和str指向同一个Stringbuffer对象,所以str1的值被改变,结果是“hello world”。
System.out.println("second: " + str)的打印结果当然是:hello world。
str = tempStr;这句将使str变量指向tempStr在堆内存中申请的内容为空字符串的StringBuffer对象,其实就是一个tempstr的别名。此时System.out.println("third : " + str);当然是空了。
退出test()方法后,由于str1的内容已经改变为:"hello world"
所以main方法中的System.out.println("third : " + str);打印输出为:hello world。
------解决方案--------------------