java为什么只有值传递?

首先看一下按值传递和按引用传递的区别??

按值传递:方法接收的是调用者提供的值

按引用传递:方法接收的是调用者提供的变量地址

 

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被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

posted @ 2019-01-09 15:42  林木声  阅读(389)  评论(0编辑  收藏  举报