先看一个问题
改程序的运行结果是?
public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
答案是:good and gbc
这就是为什么Java只有值传递没有引用传递。
这个值指的是这个实参地址的拷贝,得到这个拷贝地址后,你可以修改这个地址的内容,但引用不变,你不能使这个引用指向其他地址,但由于String这个对象是不可修改的,数组和对象是可以修改其内容的,所以答案是good and gbc.
这里在补充一点,其实这个和被final修饰的关键字是一样的,被final修饰的关键字我们都知道是不可变的,但修饰数组和对象时,我们只是保证引用不变,但不能保证对象和数组不变。所以和这个道理是一样的。