一.首先要了解的是基本数据类型和引用数据类型
对于基本数据类型,进行数值的赋值的时候,是将这个值直接存放到这个变量当中
而对于引用数据类型,进行数值的赋值的时候,是将这个变量引用的地址所对应的值改变
再调用方法的时候,实际上就是赋值的操作
这里有个例子
public static void main(String[] args) {
int num=1;
String str="abc";
char[] ch={'a','b','c'};
change(num,str,ch);
System.out.println(num);
System.out.println(str);
System.out.println(ch);
foo(ch);
System.out.println(ch);
}
public static void change(int n,String s,char[] c)
{
char[] b={'1','2','3'};
n=2;
s="bcd";
c=b;
}
public static void foo(char[] c)
{
c[0]='g';
}
输出结果如下:
对于num来说这就是最经典的值传递
将num的值传递给change方法里的n,在这个方法中实际上是对于n的值的改变,而没有对num的值改变
对于str来说虽然是引用类型,但是!在change方法里它的值发生了改变,它就会在堆里面重新开辟一个新的空间,也就是说在change方法里面,s变量实际上是String s= new String(“bcd”);
对于字符数组char[] ch在change方法里跟str相同,都是对于原先的数组长度发生了改变,从而在堆里面重新开辟一个新空间。
而在foo方法里,ch是将它的引用传递给c,然后c在foo方法直接将索引对应的值改变,并没有将原有的数组改变,所以它们就是共用一个堆空间,ch因此改变了它的ch[0]的值。
总结:
值传递:实际上是在方法里创建了一个副本用来存放值,并没有与实际参数有任何关系
引用传递:实际上是在方法里将实参的地址传递给形参,它们就共用一个地址(在没有改变长度的情况下,改变长度就会new一个堆空间),形参修改值就会将实参的值一起改变。