按值调用和按引用调用

112 阅读1分钟

按值调用和按引用调用

结论

很多程序设计语言(如c++)提供了两种方式将参数传递给方法(或函数):按值调用(call by value)和按引用调用(call by reference),而java采用的是“按值调用”(无论传递的参数类型是基本数据类型,还是对象引用)。

原因

之所以很多开发程序员认为java中存在“按引用调用”,主要原因是混淆了“参数类型”和“参数传递方式”,误认为“参数类型”为对象引用时便是引用传递,这两者之间不存在因果关系。因为,在参数类型为对象引用时,方法得到的是对象引用的副本,原来的对象引用和这个副本都引用同一个对象,即复制的是引用而非引用的对象。这就导致了无论在方法中怎样操作这个副本,都不会影响到“原来的对象引用”(参数),这就不符合“按引用调用”的特征:使用引用调用,可以在子函数中对形参所做的更改对主函数中的实参有效,而符合“按值调用”的特征:调用模块向被调用模块提供要传送参数的实际值,特殊的是这个值代表对象的引用。