关于java方法参数值传递的理解
关于Java方法参数是值传递还是参数传递,我们首先明确是值传递。先看一下下面的例子:
1、定义方法tripleValue(double x)
public void tripleValue(double x){//将参数值增加三倍
x=3*x;
}
下面调用这个方法:
double percent = 10;
tripleValue(percent);
调用结束后percent的值仍然是10,并没有发生改变。
因为方法调用的执行过程是:
1)、x被初始化为percent值的一个拷贝(也就是10)
2)、x被乘以3之后等于30。但是percent仍然是10。
3)、这个方法结束后,参数变量x不再使用
2、给方法tripleValue传递一个对象引用类型的参数
现在有一个雇员类Employee。这个类的raiseSalary(double salary)方法可以将某个雇员对象的薪资增加。
我们实现一个这样的方法tripleValue(Employee x)。
public void tripleValue(Employee x){
x.raiseSalary(200);
}
下面调用这个方法
harry = new Employee();
tripleValue(harry);
调用结束我们会发现harry的工资增长了!
好了,到这我们也许会想,这不就是引用传递吗,harry指向的对象的属性值发生变化了呀。其实不是这样的,我们再看一下方法调用的过程:
1)、x被初始化为harry值的拷贝,这里是一个对象的引用。
2)、raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200。
3)、方法结束后,参数变量x不再使用。当然,对象变量harry继续引用那个薪资增加200的雇员对象。
可见参数是对象引用时,仍然是值传递。
3、再看一个说明java参数传递是值传递的例子:
编写一个交换两个雇员对象的方法:
public void swap(Employee x , Employee y){
Employee temp = x;
x = y;
y = temp;
}
如果java对对象采用的是引用调用,那么这个方法就应该能够实现交换数据的效果:
Employee a = new Employee();
Employee b = new Employee();
swap(a,b);
但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。最终白费力气,在方法结束时参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象。
这个过程说明:java对对象采用的不是引用传递,实际上,对象引用进行的是值传递。
下面总结一下在java程序设计语言中,方法参数的使用情况:
1)、一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)。
2)、一个方法可以改变一个对象参数的状态。
3)、一个方法不能实现让对象参数引用一个新的对象。
C++有值调用和引用调用,引用参数标有&符号。可以实现tripleValue(double & x)方法或swap(Employee & x , Employee & y)方法实现修改他们的引用参数的目的
上一篇: 学破解 PE格式之MS-DOS MZ header
下一篇: 从堆和栈的角度看参数传递