public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };
public static void main(String[] args) {
Example example = new Example();
example.change(example.str, example.ch);
System.out.print(example.str + " and ");
System.out.println(example.ch);
}
public void change(String str, char ch[]) {
str = " test ok";
ch[0] = 'g';
}
}
请问为什么输出的结果是:good and gbc?
为什么String类型的值没有改,而char数组类型里面的值却改了?
虚心求助大神!
------解决方案--------------------
java当中都是值传递的。当一个对象[A]被当做参数传递以后,只是将对象[A]的一个副本传递给了方法。
原本对象[A]和副本对象[A]都指向同一块地址,当副本对象[A]被指向了一个new的对象,则副本对象[A]指向地址就变了,而原本对象[A]还是在指向原来的地址。
原本对象ch[]和副本对象ch[]也是指向同一块地址,但是ch[0]是对地址中的值进行操作,所以当ch[0]被改变时,原本对象ch[]和副本对象ch[]指向的同一块地址中记录的值就被改变了。
总结一点就是:值改变和地址改变。
具体请参考:http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html
------解决方案--------------------
给楼主增加一下难度:
public static void main(String[] args) {
StringBuilder str1=new StringBuilder("AAA");
StringBuilder str2=new StringBuilder("BBB");
StringBuilder str3=new StringBuilder("CCC");
change(str1,str2,str3);
System.out.println("str1是:"+str1);
System.out.println("str2是:"+str2);
System.out.println("str3是:"+str3);
}
public static void change(StringBuilder str1,StringBuilder str2,StringBuilder str3) {
str3=str1;
str1=str2;
str2=str3;
str1.append("1");
str2.append("2");
}
------解决方案--------------------
String对象一个重要的特性就是永久性(定长的),一旦创建就不能被改变,让一个字符串发生变化,其实就是引用了另外一个字符串,比如
String str =“abc”;System.out.println(str.hashCode());str="bcd";System.out.println(str.hashCode());显然不可能对同一个对象引用。
------解决方案--------------------
一个个参数是String类型,String是引用类型,str指向一个String对象good,String是final类型,所以方法里的str是str引用的一个拷背(两个str不是同一个对象),因为String是final类型,所以方法里的" test ok";其实是新创建的另一个对象,和"good";不是同一个对象.所以并没有改变原来的值.同理方法里的ch也是ch引用的一个拷背(两个引用不是同一个对象),但是两个引用指向的是同一个对象{ 'a', 'b', 'c' },所以会改变原来的值.