avatar

目录
java方法参数

java方法参数

程序设计语言中有关将参数传递给函数的方法有两种,一种是按值调用而另一种是按引用调用。
以c++作例子来说。

  • 值调用:

    c++
    1
    2
    3
    4
    5
    6
    void Swap(int a,int b)
    {
    int tmp=a;
    a=b;
    b=tmp;
    }
  • 引用调用

    c++
    1
    2
    3
    4
    5
    6
    void Swap(int &a,int &b)
    {
    int tmp=a;
    a=b;
    b=tmp;
    }

    以上两种例子分别代表了大多数语言的参数传递方式,但对于java语言来说,尽管有一部分人认为java也存在引用传递,但通过具体事例来看java只存在值传递一种传递方式。

现定义一函数:

java
1
2
3
4
5
6
7
public static void tripleValue(double x)
{
x=3*x;
}
//进行调用。
double percent=10;
tripleValue(percemt);

在上述函数执行之后percent并没有变为原先的二倍,函数的具体过程如下:

  1. x被初始化为percent值的一个拷贝。
  2. x被乘以3后等于30.但percent仍为10;
  3. 方法结束后局部变量x被丢弃。

即等价于:percent=10;x=10;x的变化并不会影响percent值的变化。

一个方法不可能修改一个基本数据类型的参数,但作为对象的引用的参数结果就截然不同了。
定义了一个Employee类,类中有一薪金提高操作:

java
1
2
3
4
public void raiseSalary(double x)
{
salary=salary*(1+x/100);
}

若要使职工新进提高两倍可使用如下方法:

java
1
2
3
4
public static void tripleSalary(Employee x)
{
x.raiseSalary(200);
}

当调用:

harry=new Employee(…..);
tripleSalary(harry);

即如图所示:
alt photo

具体执行过程为:

  1. x被初始化为harry值的拷贝,此处为对象的引用
  2. raiseSalary方法应用于对象引用时,x和harry同时引用了Employee对象的薪金函数,从而致使salary最终变为3倍。
  3. 方法结束后,x倍销毁,但harry的引用会使salary一直保持3倍的状态。

即等价于:Employee x=harry;x.raiseSalary(200)==harry.raiseSalary(200);
当x调用了raiseSalary方法,其由于harry同样引用了Employee里的raiseSalary方法,因而他们都会发生变化。通俗来说是Employee内的东西发生了改变,致使所有引用它的对象都发生了改变。

使用swap函数仍然可以证明java使用引用传递:

java
1
2
3
4
5
6
7
8
9
10
public void static Swap(Employee A,Employee B)
{
Employee tmp=A;
A=B;
b=tmp;
}
//引用:
Employee x=new Employee(...);
Employee y=new Employee(...);
Swap(x,y);

结果对象x与对象y并没有发生变化。

其示意图如下:
alt photo

其原理即如图所示,通过图示可以看出swap函数改变的仅仅是A和B向Employee指向的线,不论他们如何变化,都始终影响不到对象x和y。

文章作者: Liang Shuo
文章链接: http://yoursite.com/2020/02/21/java%E6%96%B9%E6%B3%95%E5%8F%82%E6%95%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 L·S
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论