首先下结论:Java中所有方法的参数传递都是按值调用。
在C中,方法的参数传递分为两种:值调用和引用调用。值传递表示方法接收到的是调用者提供的值;按引用调用表示方法接收到的是调用者提供的变量地址。
在Java中,方法总是采用按值调用的方法来传递参数,也就是说,在Java中所有的方法得到的都是所有的参数值的一个拷贝。特别的是,方法不能修改传递给它的任何参数变量的内容。
下面是参数为基本数据类型的情况:
public static void tripleValue(double x){ x = 3 * x; } main{ double a = 10; tripleValue(a); }
得到结果是:10
下面看一下具体的执行过程:
1,x被初始化为percent值得一个拷贝(也就是10)
2,x被乘以3后等于30.但是此时a仍然是10
3,这个方法结束之后,参数变量x不再使用。如下图所示
下面我们来看参数是对象引用的情况:
trupleSalary(Emploee x){ x.raiseSalary(200); } main{ harry = new Employee(...); trypleSalary(harry); }
得到结果是三倍的薪水。具体的执行过程如下:
1,x被初始化为harry值的拷贝。这里是一个对象的引用
2,raiseSalary方法应用于这个对象的引用。x和harry同时引用的那个Employee对象的薪金提高了200%;
3,方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。如下图所示
方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象
说明:对象引用在这里实际上也是按值传递的。而非引用调用