这是一道关于string的问题,论坛文章的地址:http://blog.csdn.net/steedhorse/article/details/6892569
我在这里做下扩展:
首先看下程序:
package com.tmaic.test;
public class StringTest {
public static void main(String args[]) {
String s = new String("Hello");
System.out.println(s);
foo(s);
System.out.println(s);
}
public static void foo(String s) {
s = new String("World");
}
}
输出结果:
Hello
Hello
程序变一下:
package com.tmaic.test;
public class StringTest {
public static void main(String args[]) {
String s = new String("Hello");
System.out.println(s);
foo(s);
System.out.println(s);
}
public static void foo(String s) {
//s = new String("World");
s = "World";
}
}
大家想会输出什么呢?
输出结果:
Hello
Hello
为什么会这样?
那再变一下程序:
package com.tmaic.test;
public class StringTest {
public static void main(String args[]) {
StringBuffer s = new StringBuffer("Hello");
System.out.println(s);
foo(s);
System.out.println(s);
}
public static void foo(StringBuffer s) {
//s = new String("World");
s = s.append( "World");
}
}
这次结果是:
Hello;
HelloWorld;
参考这篇文章应该很好理解:http://blog.csdn.net/tmaic/article/details/6799271
Java语言几乎一切皆引用的特点起作用了,首先new 一个string很好理解,开辟了新的空间,foo(s)传递的是s的引用,在这个方法中又new了s,由于string字符不可变,所以他新建了一个引用,这时候如果你在foo()方法体里打印s你会得到结果"world";所以现在就存在两个引用,如果把foo的方法传参改为a的话会好理解点