日期:2014-05-20  浏览次数:20752 次

【菜鸟求助】以下代码的输出结果。。。
public class AboutStr {
String str=new String("good");
char[] ch={'a','b','c'};
public static void main(String[] args) {
AboutStr ex=new AboutStr();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.println(ex.ch);
}
public void change(String str,char[] ch1){
str="text ok";
ch1[0]='g';
}

}

为什么输出结果是 good and gbc  呢?
菜鸟

------解决方案--------------------
以上可能解释的不够清楚,java参数传递都是值传递,只是基本数据类型传值,非基本类型传地址,基本类型可以直接修改其值,而非基本类型相当于是拷贝,只是和源对象指向了同一地址,他如果直接修改自己,比如:
	public static void main(String[] args) throws IOException {
  char[]test = {'a','b','c'};
  exchange(test);
  System.out.println(test);
}
private static void exchange(char[] test){
test = null;
}

如果它直接修改自己本身,对源对象不会有丝毫影响,但是他内部的属性修改是可以直接影响到的,比如A和B都指向地址C,A修改自己本身其实修改了自己指向的地址,可是他们共同指向C的属性是可以相互影响的,这就牵扯到深拷贝和浅拷贝了。
------解决方案--------------------
引用:
引用:很正常啊。这就是新手经常犯的错
public void change(String str,char[] ch1){
str="text ok";
ch1[0]='g';
}
这里面的这个str的值变了,但是这里只是传值,而不是传对象,所以仅仅只是在这个方法里面str的值为"text ok",而在主函数中,str的值并没有……
\
字符串传的是值,但是数组传的是对象。。。就这样。。。
搞清传对象还是传值就行了