代码如下:
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型数组的调用函数时候能改变值?
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型数组的调用函数时候能改变值?
你所说的这个改变值并非只有数组。集合框架中的所有东西几乎都可以。比如,你传递一个空的list给一个函数,而函数结束后你的list中有了很多的数据。这一点很多时候用来做一种以参数代替返回值的工作,说通俗些就是一个函数带多个返回值。这并不新鲜。但是,需要注意这并不是改变了值。例如,我把一个new出来的ArrayList传递到你的函数中,你让这个ArrayList对象赋值为空,或者等于其它的list,这都是没有用的,但你可以改变其中存在的内容。至于简单类型就更严格一些,传递的是副本,你更改就更加无济于事了。这才是所谓JAVA中所有的传递都是单向值传递,不是如同C/C++中的地址传递。因为在JAVA中你不能更改这个地址所对应的对象,但你可以更改这个对象里面的属性。
传递给你的非简单类型对象就如同你租用的房子,你是不可以更改内部构局的,更不能拆了建个新建筑。但是你可以决定在这个房间里如何布置你的家具……
第一个参数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语言中指针的功能(在方法内部改变外部对象的引用)。
1.对于简单类型,直接传值
2.对于对象类型(java里面除了简单类型外都是对象类型,数组、字符串等都是)也是
按值传递,只不是这时候传递的是引用(引用保存的是对象在内存中的地址).