java 变量作用范围(竟然理解错了)丢人 ——JA

系统 1608 0

这里结果输出A啊,唉,这都错,半路出家和尚啊……doit传进去的参数作用范围只是函数内部,Java是值调用。

突然想到,这里的String类型的之所以不变,是因为String类型的变量是不可变的。


可以看到结果如下:



也就是说,方法内部的变量执行另外的方法后,只有ArrayList的值改变了,而String和int类型的都没有变。




]



一.先说说参数传递的几个术语:


值调用(call by vale):表示方法接收的是调用者传递的值

引用调用(call by reference):表示方法接收的是调用者传递的变量地址

一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值



当调用如下代码

harry = new Employee();

tripleSalary(harry);

时,具体的执行过程如下:

1).x被初始化为harry对象的拷贝,这里是一个对象的引用;

2).raiseSalary方法应用于这个对象引用.即x和harry同时引用的Employee对象薪金提高了200%.

3).方法调用结束后,参数变量x不再使用.但对象变量harry继续引用那个薪金增至3倍Employee对象.

其过程如下图:

java 变量作用范围(竟然理解错了)丢人 ——JAVA基础--方法传参

通过以上实例,可以看出对象参数传递的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象.

很多程序语言提供两种传递方式:值传递和引用传递(C++和Pascal).

有些程序员认为java语言对对象参数传递也是用的引用调用.实际上是理解错误.这种错误具有一定的普遍性.下面通过一反例来说明该问题:

首先,编写一个交换两个Employee对象的方法:

public staitc void swap(Employee x,Emplyee y)

{

Employee temp = x;

x = y;

y = temp;

}

如果JAVA程序语言是对对象采用引用调用,那么这个方法就应该能够实现交换数据的效果:

Employee a = new Employee("Alice",...);

Employee b = new Employee("Bob",...);

swap(a,b);

但是,方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。

在方法结束时,参数变量x和y被丢弃了。原来的变量a和b仍然引用这个方法调用之前所引用的对象如下图:

java 变量作用范围(竟然理解错了)丢人 ——JAVA基础--方法传参

这个过程说明:java语言对对象采用的不是引用调用,实际上对象引用进行的是值传递。

最后总结一下在JAVA中,方法参数的使用情况:

*一个方法不能修改一个基本数据类型的参数;

*一个方法可以改变一个对象参数的状态(属性);

*一个方法不能实现让对象参数引用一个新对象;


java 变量作用范围(竟然理解错了)丢人 ——JAVA基础--方法传参


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论