代码如下:
public class try {
public static void main(String[] args) {
// TODO Auto-generated method stub
char ch='c';
char cp[]={'c','p'};
boolean i=true;
String str=new String("abc");
System.out.print("before the function\n"+"str="+str+"\n"+"ch="+ch+"\ni="+i+"\ncp=");
System.out.println(cp);
change(str,ch,cp,i);
System.out.print("after the function\n"+"str="+str+"\n"+"ch="+ch+"\ni="+i+"\ncp=");
System.out.print(cp);
}
public static void change(String st,char ch,char cp[],boolean i){
ch='w';
cp[0]='w';
i=false;
st="ew";
}}为什么char型数组的调用函数时候能改变值?

解决方案 »

  1.   

    将 cp 传给 change 方法时,change 方法得到的是 cp 变量的引用,这个引用指向一个 char[] 数组。所以修改 cp 的元素就是修改了这个数组的元素。而其他参数,传入的都不是引用,而是它们的值。即使做了修改,修改后的值也不会传回给调用者。
      

  2.   

    恩~~非也非也……
    你所说的这个改变值并非只有数组。集合框架中的所有东西几乎都可以。比如,你传递一个空的list给一个函数,而函数结束后你的list中有了很多的数据。这一点很多时候用来做一种以参数代替返回值的工作,说通俗些就是一个函数带多个返回值。这并不新鲜。但是,需要注意这并不是改变了值。例如,我把一个new出来的ArrayList传递到你的函数中,你让这个ArrayList对象赋值为空,或者等于其它的list,这都是没有用的,但你可以改变其中存在的内容。至于简单类型就更严格一些,传递的是副本,你更改就更加无济于事了。这才是所谓JAVA中所有的传递都是单向值传递,不是如同C/C++中的地址传递。因为在JAVA中你不能更改这个地址所对应的对象,但你可以更改这个对象里面的属性。
    传递给你的非简单类型对象就如同你租用的房子,你是不可以更改内部构局的,更不能拆了建个新建筑。但是你可以决定在这个房间里如何布置你的家具……
      

  3.   

    楼上基本正确。补充一点:
    第一个参数string是比较特殊的。因为
    String st,char ch,char cp[],boolean i
    这四个参数中,
    st,cp是对象,
    ch,i是原子类型,ch,i进入方法是传值,这容易理解。
    cp传的是一个对象句柄,能够修改其中的值也很容易理解。但string传递的也是一个引用,为什么
    st="ew";
    没有改变st这个对象的值呢?这就是String对象的特殊性,String是immutable对象,
    也就是说,这类对象,一旦创建出来,其值是完全不可以更改的。所以,st="ew"等价于:
    st=new String("ew");
    这样,就把st这个对象句柄指向了一个新的对象,而不是修改原有对象。你可以试试,如果你在方法内写上:
    cp={'1','2'};
    你会发现,返回后,原来数组的值也不会发生变化。
    所以,我们可以说,java中即便对象句柄,传递的也是对象句柄的值,而非引用,
    也就是我们永远不可能实现C语言中指针的功能(在方法内部改变外部对象的引用)。
      

  4.   

    Java是值传递.  记住一点吧.. 传参永远只是一个拷贝的过程..把这句话弄明白了..这类问题也差不多会迎刃而解了
      

  5.   

    java是按值传递的,在java里面不存在实参跟形参这一说,所有的传递都是按值传递
    1.对于简单类型,直接传值
    2.对于对象类型(java里面除了简单类型外都是对象类型,数组、字符串等都是)也是
    按值传递,只不是这时候传递的是引用(引用保存的是对象在内存中的地址).
      

  6.   

    数组调用的是按地址传值的:char是基本数据类型,传的是真正的值,而String 是引用数据类型,传的是地址,刚开始定义string对像str时就确定了一个地址,当再次给str传值时,由于原来的地址没变,所以值还是原来那个。
      

  7.   

    你错了...java中永远都是按值传递...基本类型是传递副本,引用类型也是传递副本,但是是引用的副本...不是真实内存块的副本