java的参数传递方式

看了网上一大堆有关java参数传递方式的文章,深感不得要领,哎,我也来尝试讲解一番吧。

 

按照编译理论,参数传递只有传值、传址两种主要的方式(其他还有传名和传结果),一种语言一般只有一种参数传递方式。传值就是传值的拷贝,非常好理解——C/C++、Java都是传值方式,且只有这一种方式!

 

java基本类型的值不用解释,java对象类型的值就是对象在内存中的地址,作为参数传递时,二者完全一样,都是传递值的拷贝,并且,在一个方法中,作为形式参数的变量可以被赋值(改写),不会影响作为实际参数被传递的变量的值(位于进行调用的上文环境中)。容易造成分歧的是,在一个方法中,利用对象类型参数访问并修改被指向的对象,确实会影响位于上文环境中的对象(废话,本来就是同一对象),很多人据此认为,java还有“传址”或“传引用”这种参数传递方式,其实非也,那只是对传入的地址的值的拷贝(还是地址)上的对象进行操作而已,作为形式参数的变量仍然只是一个拷贝,与上文环境无关。

 

传引用是怎么回事呢?其实,引用不过是C++引入的一个新的数据类型,纯粹是为了方便指针的使用,本质上仍然是指针,二者都是对象的地址,区别在于:

  1. 引用必须在声明时指向一个对象,指针不用(有人说引用就是对象的别名,非常正确)
  2. 引用不能被赋值(改写地址),指针可以
  3. 引用不能为空(NULL),指针可以
  4. 访问对象成员或属性的操作符不同,引用是'.',指针是'->'

C有指针类型,C++增加了引用类型,java继承了C和C++,但java的对象传递方式更类似于C中的指针——最好不要讲什么“传引用”,根本没有那种方式。

 

附:什么是形式参数和实际参数?

class A
{
	void f(int i) // 这里的i是作为形式参数的变量
	{
		i = 100;
		....
	}
}

int i = 100;
A a = new A();
a.f(i); // 这里的i是作为实际参数被传递的变量
....

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值