Java方法(method)可以不带参数,也可以带有参数。Java方法的参数类型包括基本型(primitive type)和引用型(reference type)两类。方法的参数是局部变量,调用方法时需要向方法传递参数,计算机语言的方法(或函数)的调用有两种常见的方式,一是按值调用(call by value),表示方法接受的是调用者提供的值;另外一种是按引用调用(call by reference),表达方法接受的是调用者提供的变量地址。Java的方法调用总是按值调用,其特点是方法实际得到的是传入的参数值的一个拷贝,因此通过方法无法修改传递给它的任何参数的内容。
Java在进行方法调用时,参数以传值方式进行传递。对于基本型参数,形参赋值的效果是获得一个实参值的拷贝;对于引用型参数,参数赋值的效果是获得一个实参引用值的拷贝,这样实参和形参对应的引用都指向同一个实体。在方法执行中,对于基本型参数的操作是针对拷贝值进行的,并不影响到原有实参的值;对于引用型参数的操作,相当于对引用值对应的实体进行操作,因此,对于实体的任何修改结果,开发者通过实参引用也可以访问得到。
例1中的update()方法带有一个基本型形参和一个引用型形参。第13行调用update(ss, rr)时传入实参。
【例1】 TestArg.java
class RefType {
String cont = "原始值";
}
public class TestArg {
void update(int ss, RefType rr) { // ss--基本型参数;rr--引用型参数
ss = 500;
rr.cont = "新值!";
}
public static void main(String[] args) {
int ss = 100;
RefType rr = new RefType();
TestArg t = new TestArg();
t.update(ss, rr);
System.out.println("ss=" + ss + "; rr.cont=" + rr.cont);
}
}
/* 运行结果:
ss=100; rr.cont=新值!
*/
由运行结果可见,实参ss值没有变化,而实参rr里的内容值发生了变化。调用update()方法时参数赋值和方法执行的情况示意如图1。调用方法对形参数赋值后,传值获得效果是:对于方法中基本型的参数ss,其值为实参值的拷贝,因此也是整数100;对于方法中引用型的参数rr,其值为实参对象的引用值的拷贝,因此引用值也为0x2ab,表示形参rr和实参rr对应的引用指向相同的实体。执行方法调用后,方法中的ss参数值被改为整数500,然而实参ss的值并不受任何影响;方法中rr的参数对应的实体的内容值被改为“新值!”,该实体也是实参rr所指向的,执行效果是实参rr所指向的实体内容被修改。

【例2】 TestSwap.java
class MyInt {
int value;
MyInt(int v) {
value = v;
}
}
public class TestSwap {
void swap1(int a, int b) {
int tmp;
tmp = a; a = b; b = tmp;
}
void swap2(MyInt a, MyInt b) {
MyInt tmp;
tmp = a; a = b; b = tmp;
}
void swap3(MyInt a, MyInt b) {
int tmp;
tmp = a.value; a.value = b.value; b.value = tmp;
}
public static void main(String[] args) {
int a = 111, b = 222;
TestSwap t = new TestSwap();
int x1 = a, y1 = b;
t.swap1(x1, y1);
System.out.println("x1=" + x1 + "; y1=" + y1);
MyInt x2 = new MyInt(a), y2 = new MyInt(b);
t.swap2(x2, y2);
System.out.println("x2=" + x2.value + "; y2=" + y2.value);
MyInt x3 = new MyInt(a), y3 = new MyInt(b);
t.swap3(x3, y3);
System.out.println("x3=" + x3.value + "; y3=" + y3.value);
}
}
/* 运行结果:
x1=111; y1=222
x2=111; y2=222
x3=222; y3=111
*/
由运行结果可见,只有swap3()方法才成功达成了交换目的。各swap()方法的执行效果对比示意如图2所示。

参考资料:陈荣鑫. Java编程精要[M]. 北京:清华大学出版社,2024.8.
4569

被折叠的 条评论
为什么被折叠?



