为什么是这个样子呢,兄弟,不信你看。。。

public class Main
{
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String[] args) {
Main m=new Main();
m.change(m.str, m.ch);
System.out.print(m.str+" and ");
System.out.print(m.ch);
}

public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}

输出结果:
good and gbc

求大神解释,越详细越好~!谢谢!
为什么不是
test ok and gbc

http://blog.csdn.net/wuwenxiang91322/article/details/17038557

String 类型的传递 是引用传递。也即是地址传递。传的是str的地址。把str里“good”的地址传给change()方法里的str。change()里的str赋予新的地址。是“test ok”的地址。此时ex.str对“good”的引用没变。就是还是存放“good”的地址。所以。ex.str还是“good”
基本数据类型传递的是值。
但是数组类型是引用类型。传的也是ch的中{‘a’,‘b’,‘c’}的地址。ch[0]修改为‘g’。基本数据类型的修改改的是其值。所以change()中ch接受传来的ex.ch的地址,指向{‘a’,‘b’,‘c’},修改其中的ch[0]后。修改保持。ex.ch引用不变。变为{‘g’,‘b’,‘c’}
要想修改它们的值,change()传的是Example e
change(Example e){
e.str=“test ok”;
e.ch[0]='g';
}

这个是肯定的,首先参数传递都是值传递的过程。在这里涉及的都是引用变量的值传递,会在内存中有变化;String str = new String("good");这个str对象,是全局变量,引用变量指向堆内存的中的值good,不会改变。
而方法change方法中虽然又从新给str赋值了,但是change方法里的str是一个局部变量,指向另外一个值test ok但是,当方法执行结束后,该引用就会失效,所以str又会从新回到good上,最重要的是并没有真正改变str的值,只是改变了引用对象;
相同的道理,但是如果你改变了引用变量本身的值的时候,原来的值就会跟着改变,就像这里的ch对象一样会随着改变。