专业术语——
按值调用(call by value) 表示方法接受的是调用者提供的值。
按引用调用(call by reference) 表示方法接受的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
java中只有值传递!
java中只有值传递!
java中只有值传递!
重要的事情要说三遍!!!
也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
public static void tripleValue(double x) // doesn't work
{
x=3*x;
}
double persent = 10;
tripleValue(percent);
可以看到,无论怎样,调用这个方法之后,percent的值还是10.下面看一下具体的执行过程:
1) x 被初始化为percent值的一个拷贝(也就是10)。
2) x被乘以3后等于30.但percent仍然是10)
3) 这个方法结束之后,参数变量x不再使用。
方法参数共有两种类型:
.基本数据类型(数字、布尔值)。
.对象引用。
一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,可以很容易地利用下面这个方法实现将一个雇员的薪金提高两倍的操作:
public static void tripleSalary(Employee x) //works
{
x.raiseSalary(200);
}
当调用
harry = new Employee(...);
tripleSalary(harry);
时,具体的执行过程如下:
1) x被初始化为harry 值的拷贝,这里是一个对象的调用。
2) raiseSalary 方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200%。
3) 方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。
方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。
下面我们写一个交换两个对象的方法:
Boy a = new Boy(...);
Boy b = new Boy(...);
swap(a,b);
public static void swap(Boy x, Boy y) //doesn't work
{
Boy temp = x;
x = y;
y = tmp;
}
swap 方法的参数x和y 被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
然而,在方法结束后参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。
总结:
.一个方法不能修改一个基本数据类型的参数(即布尔型和数值型)。
.一个方法可以改变一个对象参数的状态。(即对象成员属性的值,一般为set(....)方法 )
.一个方法不能让对象参数引用一个新的对象。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有