程序如下:
public class GoodAndGbc {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String[] args) {
GoodAndGbc t = new GoodAndGbc();
t.change(t.str, t.ch);
System.out.print(t.str + " and ");
System.out.println(t.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
输出结果:
解析:
这是java参数传递方式的问题,Java参数,不管是原始类型还是引用类型,传递的都是副本。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值。如果在函数中改变了副本的 值不会改变原始的值。
如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。
a.传递值的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对 象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指 向的内存地址)。
b.传递地址值的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
ps: String 是 final 的。所以值是不变的。 函数中String对象引用的副本指向了另外一个新String对象,而数组对象引用的副本没有改变,而是改变对象中数据的内容.