当前位置: 首页 > 知识库问答 >
问题:

数组在Java中是按值传递还是按引用传递?[副本]

宋成天
2023-03-14

数组在Java中不是一种基元类型,但它们也不是对象,那么它们是通过值传递还是通过引用传递呢?它是否取决于数组包含什么,例如引用或基元类型?

共有1个答案

范翰飞
2023-03-14

你的问题是基于一个错误的前提。

数组在Java中不是一种基元类型,但也不是对象……“

事实上,Java中的所有数组都是对象1。每个Java数组类型都有Java.lang.Object作为其超类型,并继承了ObjectAPI中所有方法的实现。

...那么它们是按值传递还是按引用传递?它是否取决于数组包含什么,例如引用或基元类型?

简短的回答:1)通过值传递,2)没有区别。

更长的答案:

和所有Java对象一样,数组是通过值传递的...但值是对数组的引用。因此,当您为被调用方法中的数组的单元格赋值时,您将为调用方看到的相同数组对象赋值。

这不是通过引用。真正的按引用传递涉及到传递变量的地址。通过实际的按引用传递,被调用的方法可以赋值给它的局部变量,这会导致调用方中的变量被更新。

但不是在Java。在Java中,被调用的方法可以更新数组的内容,它可以更新其数组引用的副本,但不能更新调用方中保存调用方数组引用的变量。因此...Java提供的不是参照通行。

下面是一些解释按引用传递和按值传递之间区别的链接。如果你不理解我上面的解释,或者如果你觉得倾向于不同意术语,你应该阅读它们。

  • http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/cplr233.htm
  • http://www.cs.fsu.edu/~Myers/C++/Notes/References.html

相关SO问题:

  • Java是“按引用传递”还是“按值传递”?

历史背景:

短语“按引用传递”最初是“按引用调用”,它用于区分FORTRAN(按引用调用)的参数传递语义和ALGOL-60(按值调用和按名称调用)的参数传递语义。

>

  • 在按值调用中,参数表达式被计算为一个值,并将该值复制到被调用的方法。

    在按引用调用中,参数表达式的部分求值为传递给调用方法的“lvalue”(即变量或数组元素的地址)。然后调用方法可以直接读取和更新变量/元素

    在按名调用中,实际的参数表达式传递给调用方法(!!)它可以对其进行多次计算(!!!)。这实现起来很复杂,而且可能被用来(滥用)编写非常难懂的代码。只在Algol-60中使用过按名呼叫(谢天谢地!)。

    更新

    实际上,ALGOL-60的按名调用类似于将lambda表达式作为参数传递。问题在于,这些不完全lambda表达式(它们在实现级别被称为“thunk”)可以间接修改调用过程/函数范围内的变量的状态。这就是为什么他们如此难以理解的部分原因。(例如,请参阅Jensen的设备上的维基百科页面。)

    1。链接的问答(Java中的数组以及它们如何存储在内存中)中没有任何内容说明或暗示数组不是对象。

  •  类似资料:
    • 问题内容: 数组不是Java中的原始类型,但它们也不是对象,因此它们是按值还是按引用传递?它是否取决于数组包含的内容,例如引用或原始类型? 问题答案: 。如果是Array(只不过是Object),则数组引用按值传递。(就像对象引用按值传递)。 当你将数组传递给其他方法时,实际上是复制对该数组的引用。 通过该引用对数组内容进行的任何更改都会影响原始数组。 但是,将引用更改为指向新数组不会更改原始方法

    • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未

    • 问题内容: 我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。 执行 谁能向我解释这些问题… 价值传递是什么意思? 答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。 How do you say Java是通过价值传递? 为什么Java是按值传递而不是按引用传递? 上面的程序Tries是否显示了“按值传递”和“引

    • 本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。   按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被

    • 因此,在父对象的状态中所做的更改也可以通过它所出现的道具立即在子对象中使用。 这样做正确吗?

    • 我创建了一个MapReduce作业,该作业将计算键的数量,然后根据它们出现的次数对它们进行排序 处理输入时,如 最终目标将是一个类似于 我的地图阶段输出a 我的减少阶段有3个阶段:设置,我初始化一个数组列表来保存我的 数组列表中的值是我创建的一个对象myObject的值,它将文本和Int保存在一个元组中可写,我发现一个奇怪的地方是当我这样做的时候 key是传递到reducer的键,count是我通