1.Java值传递与引用传递

2018-03-24  本文已影响0人  喜欢多一点

1.在平时写程序的时候,偶尔会遇到这样的问题:调用一个方法修改某一个参数的值,但是程序的运行结果和预料的不一样。而且有时候灵,有时候不灵,这就很头疼。今天来总结一下这个问题的原因。
2.首先,举个例子来重现问题。


image.png
image.png
image.png

于是,出现了两个显而易见的问题。
首先,基本类型和对象类型在方法调用的过程前后,基本类型的原值不会改变,对象类型在经过方法调用后,值发生了改变。

其次,包装类型是属于对象类型的,但是运行结果和对象类型截然不同。

那么在调用recount方法的前后,究竟发生了什么事呢?
答:在调用方法的时候,arg作为形参,将实参的值拷贝到自己这里。当实参是基本类型的时候,在方法内部修改arg的值,本质是修改形参的值,跟实参没有关系。在方法执行完毕后,退出方法栈,arg也就消失了,完全不会影响实参的值。当实参是对象类型的时候,在方法内部修改实际引用的对象的值的时候,外部的实参所对应的对象的值也就被改变了。当参数类型是包装类型(还包括String)时,因为包装类型(String)的对象都是不可修改的,我们在执行这段代码时:str="abcde";
实际上是创建了一个新的对象,并将形参指向这个新创建的对象,当方法执行完毕后,实参并没有受到影响。

结论:像包装类、String类这样的类,虽然是对象类型,但是由于他们的对象是不可以修改值的,所以在作为形参的时候,产生的效果类似于基本类型。

上一篇下一篇

猜你喜欢

热点阅读