首先看一下按值传递和按引用传递的区别??
按值传递:方法接收的是调用者提供的值
按引用传递:方法接收的是调用者提供的变量地址
Java程序设计语言总是采用按值调用。也就是说方法得到的是所有参数值的一个拷贝。也就是说方法不能修改传递给他的任何参数变量的内容。
下面通过3个例子说明
例子1
1 public static void main(String[] args) { 2 int num1 = 10; 3 int num2 = 20; 4 5 swap(num1, num2); 6 7 System.out.println("num1 = " + num1); 8 System.out.println("num2 = " + num2); 9 } 10 11 public static void swap(int a, int b) { 12 int temp = a; 13 a = b; 14 b = temp; 15 16 System.out.println("a = " + a); 17 System.out.println("b = " + b); 18 }
结果:
1 a = 20 2 b = 10 3 num1 = 10 4 num2 = 20
通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样。
例子2
1 public static void main(String[] args) { 2 int[] arr = { 1, 2, 3, 4, 5 }; 3 System.out.println(arr[0]); 4 change(arr); 5 System.out.println(arr[0]); 6 } 7 8 public static void change(int[] array) { 9 // 将数组的第一个元素变为0 10 array[0] = 0; 11 }
结果
1 1 2 0
array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。
通过 例子2我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。
例子3
1 public class Test { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 Student s1 = new Student("小张"); 6 Student s2 = new Student("小李"); 7 Test.swap(s1, s2); 8 System.out.println("s1:" + s1.getName()); 9 System.out.println("s2:" + s2.getName()); 10 } 11 12 public static void swap(Student x, Student y) { 13 Student temp = x; 14 x = y; 15 y = temp; 16 System.out.println("x:" + x.getName()); 17 System.out.println("y:" + y.getName()); 18 } 19 }
结果
x:小李
y:小张
s1:小张
s2:小李
方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。