关于Java参数传递的问题,我们在学校学习编程语言的时候会经常听老师说方法的参数传递包括值传递和引用传递,那么什么是值传递和引用传递呢?我的理解是引用传递只是值传递的一种特殊情况,看下面的代码:
public static void main(String[] args){
int c = 5;
int d = 6;
change(c,d);
System.out.println(c);
System.out.println(d);
}
private static void change(int a,int b) {
a=1;
b=3;
}
以上代码运行结果:5,6 为什么不是1,3 呢?这个就是因为值传递问题,因为实参传给形参的实际上是实参的一份copy,这份copy的改变不会影响实参的值,不明白?接着往下看
public static void main(String[] args){
int a[] = new int[]{3,2,6,5};
change(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
private static void change(int[] b) {
b[0]=1;
}
上面的例子中,我们将数组a传递给change函数,这个函数只是简单地将第一个元素改为1,运行结果:1,2,6,5。也就是说原数组a的第一个值被修改了,为什么这里又被改变了呢?这里面a数组是将数组的引用传递给了形参b,换句话说,a和b都指向了同一块内存地址,就像你和你女票去吃饭一样(没有女票那就找个基友去吃吧),你将一双筷子传递给了你女票,但是你们吃饭的时候夹的都是同一个盘子里的菜,你吃了一块肥肉,那肥肉就到你肚子里了,那盘子(数组)里的菜(元素)是不是就改变了。所以说,引用传递实际上就是实参将地址传递给了形参(也就是我所理解的特殊的值传递)。那最上面说的值传递又怎么理解?很简单,你和你女票(基友)去吃饭,你打了一碗饭给你女票,你女票吃了你给她打的饭,但是你那碗饭并没有减少(如果你没有吃过的话)。接着往下看
public static void main(String[] args){
int a[] = new int[]{3,2,6,5};
change(a);
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
private static void change(int[] b) {
int[] c = new int[]{5,6,7,8,9};
b = c;
}
上面的运行结果:3,2,6,5。为什么?还是你和女票(基友)去吃饭,女票想喝汤,你递了一个勺子给她,接到勺子之后她突然间不想喝了,反而拿起筷子吃饭了,那么汤还会有改变吗?当然不会,换句话说,b数组重新指向了c数组的地址。