从技术上讲,它是通过value …传递的,但是值是对数组的引用。
通过引用的实际传递涉及传递变量的地址,以便可以更新变量。这不是当你在Java中传递数组时会发生什么。
(这个Java文档页面可能会帮助你理解这一点:陷阱:将变量视为对象。)
这里有一些链接,解释“传递引用”和“传递值”之间的区别:
相关问题:
历史背景:
短语“pass-by-reference”最初是“call-by-reference”,它用于区分FORTRAN(call-by-reference)的参数传递语义与ALGOL-60和按名称调用)。
>在调用值中,参数表达式被计算为一个值,并且该值将被复制到被调用的方法。
>在调用引用中,参数表达式被部分计算为传递给调用方法的“lvalue”(即变量或数组元素的地址)。然后调用方法可以直接读取和更新变量/元素。
>在调用名称中,实际的参数表达式被传递给调用方法(!!),它可以多次计算(!!!)。这实现起来很复杂,可以使用(滥用)编写很难理解的代码。 Call-by-name只能在Algol-60中使用(谢天谢地!)。
更新
实际上,Algol-60的call-by-name类似于将lambda表达式作为参数传递。皱纹是这些不完全的lambda表达式(它们在实现级别被称为“thunk”)可以间接地修改调用过程/函数中范围内的变量的状态。这是什么使他们这么难以理解。 (例如,参见Jensen’s Device上的维基百科页面。)