选择 Java 函数调用中的按值传递行为

Posted

技术标签:

【中文标题】选择 Java 函数调用中的按值传递行为【英文标题】:Elect for Pass-By-Value behavior in Java function calls 【发布时间】:2016-08-18 23:09:30 【问题描述】:

当我将我的对象传递给方法或函数时,是否可以设置我的 Java 项目(或它的某个子集)的默认行为来复制我的对象?

想要这种行为的原因是我正在编写一些测试来检查两个函数是否产生相同的返回。如果我将ObjectA(其中属性计数初始化为3)传递给函数decrementCount(),那么当它返回对象时,我将看到(ObjectA.count -> 2),而在调用第二个函数之后,对象现在是(ObjectA.count -> 1)

我想实现按值传递而不是按引用传递。

【问题讨论】:

***.com/questions/40480/… 可以深拷贝对象github.com/kostaskougios/cloning 【参考方案1】:

当我将我的对象传递给方法或函数时,是否可以设置我的 Java 项目(或它的某个子集)的默认行为来复制我的对象?

不,Java 只是按值传递。 Java 的变量只能是原语和引用。它们不能是对象,并且您不能强制复制它们(不显式复制它们)。

如果我将 ObjectA(其中属性计数初始化为 3)传递给函数 decrementCount(),而不是当它返回对象时,我将看到 (ObjectA.count -> 2),而在调用第二个函数后,对象是现在(ObjectA.count -> 1)。

我建议您为每个测试重新创建对象。如果你想防止修改,你可以测试它没有被修改。

我想实现按值传递而不是按引用传递。

这实际上是您唯一的选择。但是,引用中的值的副本不是深层副本。

【讨论】:

如果我理解正确,您是说 java 是按值传递的。但是,当我想到按值传递时,我会想到复制。在这种情况下,是引用本身被复制了吗?所以这不是我在最初的问题中暗示的那种复制? Java 按值传递引用,而不是它们引用的对象。这是一个微妙的区别,我知道。 @user5797668 是的,如果你写String s 认为s 是一个字符串对象,那么它不是一个常见的误解。 s 是对字符串的引用,如果您分配或复制它,您只会复制该引用。如果你这样做s == t,你比较的是参考,而不是它们的内容。如果您执行s = null;,则不会破坏字符串,而是设置了对null 的引用。 Java 中没有特殊符号表示它是引用,因为没有其他选项。 我知道引用只是指向其他地方称为对象的现有数据结构。但是,我不确定这个 @504 引用类型是被复制还是简单地传递。因此,准确地说,它被称为“引用,通过值传递”?而不是“通过引用传递的引用”。无论哪种方式,对象的深层副本都是我的最终目标。 @user5797668 我建议你创建一个方法来生成你的测试数据,你不会有重复的代码。

以上是关于选择 Java 函数调用中的按值传递行为的主要内容,如果未能解决你的问题,请参考以下文章

C/C++按值传递和按地址传递

Java的按值传递和按引用传递解说

Java是值传递还是引用传递?

浅析js的函数的按值传递参数

C#在方法调用中,参数按值传递与按引用传递的区别是啥?

按值传递参数时的奇怪行为