一、原因
String类的存储是通过final修饰的char[]数组来存放结果的,不可更改。故每次当外部一个String类型的引用传递到方法内部时,只是把“外部String实例对象”的引用传递给了方法参数变量,使得外部String类型变量和方法参数变量都是实际char[]数组的引用而已。当我们在方法体中改变这个参数的引用时,因为char[]数组是不可变的,故每次修改都会导致创建一个新的String实例对象,而方法体中的方法参数就会指向这个新创建的String实例对象,而非指向原来外部的String实例对象了。故从方法执行前到方法执行后,外部String类型的引用始终指向原String实例对象。
二、例子
public class test
{
public static void modify(String text)
{
text = "app";
}
public static void main(String[] args)
{
String s = "apple";
System.out.println("修改前:"+ s);
modify(s);
System.out.println("修改后:"+ s);
}
}
运行结果:
修改前:apple
修改后:apple
三、例子剖析
设s指向内存空间A,内存空间A存放了“apple”这个字符串,然后调用modify方法将s引用传递(赋值)给了text引用,为传址方式!但String是不可变的,任何更改都会产生新的String实例对象,并将其存放在某个内存空间。故在modify方法体中text指向的不是外部的“apple”实例对象,不是指向内存空间A,而是指向新创建的“app”实例对象(存放在内存空间B),指向内存空间B!但此时外部的String引用变量s仍然指向内存空间A,仍然指向“apple”实例对象!