方法参数传值
按……调用(call by)是一个标准的计算机术语,用来描述各种程序设计语言。
java中总是采用按值调用。也就是说,方法得到的是参数值的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容。
例如,以下的调用:
public class Test {
public int num;
public static void main(String[] args) {
Test t = new Test();
t.num= 0;
add(t.num);
System.out.println(t.num);
}
public static void add(int x) {
x+=3;
}
}
在方法调用后,x的值还是为0,下面我们就具体看看执行的过程。
-
x被初始化为一个num的拷贝值(也就是0)。
-
x进行运算,变为3,但是num仍是10。
-
这个方法结束后,参数变量
当然,方法参数共有两种类型:
-
基本数据类型
-
对象引用
目前来说,一个方法不能修改一个基本数据类型的参数。而对象引用作为参数就不同了,可以很容易下面的方法实现num增加3的操作。
public class Test {
public int num;
public static void main(String[] args) {
Test harry = new Test();
harry.num=10;
harry.add(harry);
System.out.println(harry.num);
}
public void add(Test x) {
x.raiseNum();
}
public void raiseNum() {
int result = num*3;
num = result;
}
}
具体的步骤为下:
-
x被初始化为harry值的拷贝值,这里是一个对象的引用。
-
raiseNum方法运用于这个对象的引用,x和harry同时引向的Test(图中的Employee)对象的num进行了乘3的操作
-
方法结束后,参数变量x不再使用。不过,对象变量的harry将继续引用那个num乘3的Test对象。
总结
-
一个方法不能修改一个基本数据类型的参数(四类八种)。
-
一个方法可以改变一个对象参数的状态。(状态即是对象的成员变量)。
-
一个方法不能让对象参数引用一个新的对象。(容易混淆,初学者只需要牢记java是值传递) 。
第三点如果需要深究,建议看下《Java核心技术卷1》
参考文档:《Java核心技术卷1》