java方法参数
程序设计语言中有关将参数传递给函数的方法有两种,一种是按值调用而另一种是按引用调用。
以c++作例子来说。
值调用:
c++1
2
3
4
5
6void Swap(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}引用调用
c++1
2
3
4
5
6void Swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}以上两种例子分别代表了大多数语言的参数传递方式,但对于java语言来说,尽管有一部分人认为java也存在引用传递,但通过具体事例来看java只存在值传递一种传递方式。
现定义一函数:
java
1 | public static void tripleValue(double x) |
在上述函数执行之后percent并没有变为原先的二倍,函数的具体过程如下:
- x被初始化为percent值的一个拷贝。
- x被乘以3后等于30.但percent仍为10;
- 方法结束后局部变量x被丢弃。
即等价于:percent=10;x=10;x的变化并不会影响percent值的变化。
一个方法不可能修改一个基本数据类型的参数,但作为对象的引用的参数结果就截然不同了。
定义了一个Employee类,类中有一薪金提高操作:
java
1 | public void raiseSalary(double x) |
若要使职工新进提高两倍可使用如下方法:
java
1 | public static void tripleSalary(Employee x) |
当调用:
harry=new Employee(…..);
tripleSalary(harry);
具体执行过程为:
- x被初始化为harry值的拷贝,此处为对象的引用
- raiseSalary方法应用于对象引用时,x和harry同时引用了Employee对象的薪金函数,从而致使salary最终变为3倍。
- 方法结束后,x倍销毁,但harry的引用会使salary一直保持3倍的状态。
即等价于:Employee x=harry;x.raiseSalary(200)==harry.raiseSalary(200);
当x调用了raiseSalary方法,其由于harry同样引用了Employee里的raiseSalary方法,因而他们都会发生变化。通俗来说是Employee内的东西发生了改变,致使所有引用它的对象都发生了改变。
使用swap函数仍然可以证明java使用引用传递:
java
1 | public void static Swap(Employee A,Employee B) |
结果对象x与对象y并没有发生变化。
其原理即如图所示,通过图示可以看出swap函数改变的仅仅是A和B向Employee指向的线,不论他们如何变化,都始终影响不到对象x和y。