前言

在计算机科学中有一个术语按···调用(call by)用来表示各种编程语言中方法参数的行为。
常见的调用方式有以下两种:

  • 按值调用(call by value)
  • 按引用调用(call by reference)

按值调用

按值调用表示方法接受的是调用者提供的值,对于这种调用方式方法得到是所用参数值的一份副本 ,以下是两种编程语言的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
namespace test{
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
}
int main(int argc, char const *argv[])
{
int a = 10;
int b = 20;
test::swap(a, b);
std::cout << a << " " << b << std::endl;
return 0;
}

10 20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main{
public static void main(String[] args){
A a = new A(10);
A b = new B(20);
swap(a, b);
System.out.println(a.getValue());
System.out.println(b.getValue());
}

public static void swap(A a, A b){
A temp = a;
a = b;
b = temp;
}
}

10
20

按引用调用

按引用调用表示方法接受的是调用者提供的变量的位置(location),对于这种调用方式方法可以直接修改所用的参数的值,在c++中可以实现这种操作,但Java中并不可以,Java中的方法调用总是按值调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
namespace test{
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
}
int main(int argc, char const *argv[])
{
int a = 10;
int b = 20;
test::swap(a, b);
std::cout << a << " " << b << std::endl;
return 0;
}

20 10