public class TestString
{
public static void link(String a)
{
a+="word";
}
public static void main(String []args)
{
String a="hello";
link(a);
System.out.println(a);
}
}
输出的是 hello ,不是hello word
:这是个引用数据类型数据传递的问题(相当与我们常说的传引用调用),并非基本数据类型的参数传递(传值调用)。
public static void link(String a)
{
a+="word"; //语句2,把这个参数叫a2
}
String a="hello"; //语句1,把这个参数叫a1
语句1在执行的时候在堆中产生了一个"hello"对象,然后栈中引用变量指向a1指向"hello",在执行link(a)时将a1传给了a2,此时只是在栈中多了一个a2变量,堆中并没有新产生一个"hello"对象,即a1和a2指向的是同一个"hello",然后执行语句一a+="world";此时在堆中有产生了一个对象"helloworld",并将变量a2指向这个"helloworld",但a1仍然指向"hello",所以最后的打印结果是"hello"。这是由于String类型是一种特殊类型的引用类型,对String进行的任何修改,String都会新产生一个对象,存放修改后的String。可以比较一下下面的代码:
import java.util.*;
public class TestDYong {
public static void main(String[] args) {
StringBuffer str=new StringBuffer().append("hello");
change(str);
System.out.println(str);
}
public static void change(StringBuffer str){
str.append("world");
}
}
由于StringBuffer的append并不产生新的对象(区别与String的+产生新对象),所以上面代码打印的是"helloworld"
String类是final类。