java中方法的参数传递方式只有一种:值传递;
对于基本类型来说,传递的是实参的副本(值传递),故在方法内修改传递进来的值并不会影响实参本身;
对于引用类型来说,传递进来的是引用变量的副本(也是值传递),因此该副本与实参均是引用变量,他们均可以操作所引用的对象,在方法内通过引用变量对堆区的对象进行操作时均会对该对象有影响。由于传入方法的是实际参数值的副本,因此,参数本身不会受到任何影响!举两个典型例子:
1.以简单选择排序中的交换函数为例:
package practice;
import java.util.Arrays;
public class SelectionSort{
public static void main(String [] args) {
int[] a=new int[5];
int n=a.length;
for(int i=0;i<n;i++) {
a[i]=(int)(Math.random()*100);
}
System.out.println("原数组是:"+Arrays.toString(a));
WrongSwap(a[0],a[1]);
System.out.println("WrongSwap后:"+Arrays.toString(a));
swap(a,0,1);
System.out.println("swap后:"+Arrays.toString(a));
}
static void swap(int[]a,int i,int j) {
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
static void WrongSwap(int b,int c) {
int temp;
temp=b;
b=c;
c=temp;
}
}
原数组是:[14, 82, 75, 66, 62]
WrongSwap后:[14, 82, 75, 66, 62]
swap后:[82, 14, 75, 66, 62]
之所以WrongSwap没有达到交换元素的目的,是因为b,c是基本类型,调用WrongSwap传进去的是a[0],a[1]的值的拷贝,函数调用对它们并没有影响;
而swap达到了交换元素的目的是因为,int[ ]a是引用类型,在参数传递的过程中,系统复制了引用变量a的副本传进方法,由于a只是一个引用变量,故实际操作的还是堆内存中的数组对象.
可参考《java疯狂讲义(第三版)》5.2.2节
2.下面一个例子更形象地说明传给方法的是实参的副本而不是它本身
如果传进去的是实参本身,则调用revive方法后,teemo应该纸箱hp是383的new的Hero,下面画了一个简单的图说明一下方法调用过程中的内存变化,理解粗浅,如有错误敬请指正。