首先回顾一下 在程序设计语言中有关将参数传递给方法(或函数)的一一些专业术语。按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call byreference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。
Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给他的任何参数变量的内容。
public class 值传递 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1=" + num1);
System.out.println("num2=" + num2);
}
private static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}
解析:在swap方法中,a、b的值进行交换,并不会影响到num1、num2。因为,a、b中的值,只是从num1、num2的复制过来的。也就是说,a、b相当于num1、num2的副本,副本的内容无论怎么修改,都不会影响到原件本身。
通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看下面例子.
class Test7{
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
System.out.println(arr[0]);
chang(arr);
System.out.println(arr[0]);
}
private static void chang(int[] array) {
//将数组的第一个元素变为0
array[0] = 0;
}
}
结果:
解析:array被初始化arr的拷贝也就是-一个对象的引用,也就是说array和arr指向的是同一个数组对象。因此,外部对引用对象的改变会反映到所对应的对象上。
通过上面例子我们已经看到,实现一个改变对象参数状态的方法并环是一件难事。理曲很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。