java专业问题 求高手详细解答

public class duixiang {
//private static String name = "张三";
public static void main(String[] args) {
int[] a= {11,52,47};
String name = "张三" ;
System.out.println(a[0]);
System.out.println(name);

fun(a,name);
System.out.println(a[0]);
System.out.println(name);
}
static void fun(int[] a1, String name1){
a1[0] = 40;
name1 = "李四";
}
}
答案怎么会是 11 张三 40 张三? 求高手解答

这是基础中的基础啊,甚至没有用到面向对象编程思想,只是用Java写的c程序罢了。

从主方法开始看,
第一次打印输出的是a[0],前一行刚定义的a[0]是11,a[1]是52,a[2]是47,数组下标从0开始的。
第二次输出变量 name 的值,前一行定义的 name = "张三",输出当然是张三
第三次输出的是a[0]的值,但a[0]的值在调用方法fun时被修改了,数组参数是引用传递,在方法中修改传入的参数数组的值,实际改写的并不是传入参数数组的副本,而是参数数组本身。修改a[0]=40,打印当然是40
最后输出 name的值,这个变量根本就没被修改过,定义时是张三,现在还是张三
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-19
答案没错。 String类的对象是final型的常量。不允许更改值。
如果要在子方法中改值,用StringBuffer或StringMap或自己重新封装一次String
第2个回答  2013-08-19
因为int[] 和String非基本数据类型,作参数传递的时候属于引用传递,即传递的是内存地址的引用,然后对其再赋值会覆盖掉原先的值
第3个回答  2013-08-19
第一个是 11 张三 ,你应该没有任何疑问
第二个是 40 张三 ,原因是 数组是引用数据类型,在方法里面传的是引用,就是一个地址,在方法里面把地址指向的内容改变了,假设地址指向的内存是123 ,123地址把自己复制一份给了方法,方法把123指向的内存 中的内容改变了。那么在外面123虽然数组的指向的地址没有发生任何变化,但是地址中的内容的确在方法里面已经被改变了。 而 String其实你可以把它作为一个基本类型数据看待,只是java的处理机制。基本类型传给方法的只是一个 数据的复制,比如123把自己复制一份给了方法,方法把复制的到的123任意改变,但是原来的123不会改变。
你可以百度一下引用类型和基本类型
第4个回答  2013-08-20
好基础唉。。。。这个也要找大神。。。那大神们岂不是要很忙。。。。
相似回答