Java的变量传递机制是值传递,也就不论何时,传递的变量都是原变量的值得一份拷贝。
当被传递的变量是基本类型变量的时候,传递的是基本类型变量的值的拷贝。所以无法用一个方法来改变一个基本类型变量的值。
如以下代码所示:public void tripleValue(int x) { x = 3 * x; }
然后调用这个方法:
int x = 3; tripleValue(x); System.out.println(x); //输出为3
因为tripleValue方法接收到的变量只是原基本类型变量的值的一个拷贝,所以该改变仅在方法体内有效。而对方法体外的原基本类型变量x没有影响。
当被传递的变量类型是引用类型变量的时候,传递的是引用类型变量的地址值的一个拷贝。同理,用方法也无法让原引用类型变量引用一个新对象。
但是我们可以使用方法来改变原引用类型变量的实例变量或调用原变量的实例方法。如下所示:public void doubleSalary(Employee x) { x.salary *= 2; }
当调用
Employee harry = new Employee(...); doubleSalary(harry);
可以发现harry的salary变量加倍了。
以上代码的具体执行过程是:- X被初始化为harry值的拷贝,这里是一个对象的引用,也就是harry的地址。
- X引用的对象的salary变量乘以2。也就是harry引用的对象的变量乘以2。
- 方法结束后,参数变量X不再使用。当然,对象变量harry继续引用那个薪金增至2倍的雇员对象。
下面再给出一个例子。
public void swap(Employee x, Employee y) { Emoloyee tmp = x; x = y; y = tmp; }
然而执行如下代码之后:
Employee a = new Employee(...); Employee b = new Employee(...); swap(a, b);
可以发现a,b并没有发生任何变化。swap方法的参数x和y被初始化为两个对象的引用的拷贝,这个方法交换的是这两个拷贝,对a和b没有任何影响。
总结
JAVA 中方法参数使用情况
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
补充一下值传递和引用传递的区别
- 值传递
所谓的值传递就是指调用者和被调用者共享的是不同的变量,但这两个不同变量具有同一个值。比如上边的tripleValue(x)
方法在被调用的时候,我们将x
作为参数传递给了它,这时候,tripleValue(x)
在起方法体内对x
进行操作的时候只是得到了一个和原来的x
具有相同值得变量,而非得到了x
本身。 - 引用传递
所谓的引用传递指的是调用者和被调用者共享的参数是同一个变量(既对这个变量的引用)。如果在被调用的方法中对这个变量做了任何的改变,这个改变都会被反映在调用该方法的方法里的这个参数上。