Java方法的参数传值


  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所指向的实体内容被修改。
图1 调用update( )方法的效果

图1 调用update( )方法的效果
  为了进一步理解Java的参数传值效果,举个对两个变量的整数值进行交换的实例。例2给出了三种不同的设计方案:swap1()方法利用基本型参数直接进行交换处理;swap2()方法利用引用型参数直接进行交换处理;swap3()方法利用引用型参数赋值,方法中对引用对象的值进行交换处理。

【例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所示。
图2 调用不同swap( )方法的对比

图2 调用不同swap( )方法的对比

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值