通过引用传递到 setter

Passing by reference into a setter

提问人: 提问时间:12/14/2017 更新时间:12/14/2017 访问量:974

问:

因此,我在 Swing 程序上遇到了一些非常大的内存和 CPU 泄漏,并意识到我并没有在 EDT 上执行所有必要的内容,而是愚蠢地将所有内容传递到方法中,最终意识到我正在复制对象及其 2000 个数组,因为“按值传递”规则。

我的问题是,对于以下代码:

public class Test {
    Object obj = new Object();
    public void setOBJ(Object obj) {
        this.obj = obj;
    }
}

它是否设置为 的新实例 ,或对 的引用?this.objobjobj

此外,它是否在每种情况下都这样做,或者在某些情况下可能会发生一个或另一个?我会尝试这个,但不知道从哪里开始以及它可能发生在什么情况下。

最后,在多线程中,是否有任何变化,或者它仍然会以相同的方式传递?说实话,只是好奇。

Java 对象 按引用 传递值

评论

1赞 Turing85 12/14/2017
“它是否设置为 的新实例 ,还是对 的引用?” -> 它返回对对象的引用,而不是克隆。“此外,它是否在每种情况下都这样做”——>是的,你总是通过引用。“在多线程中,是否有任何变化,或者它仍然会以相同的方式传递?” ->是的,即使在多线程环境中,引用也会传递给方法。this.objobjobj
0赞 Arnaud Denoyelle 12/14/2017
看看这个链接TL;DR :您只复制此对象上的引用,不克隆它。由于另一个原因,您的程序很慢。
0赞 12/14/2017
@Turing85 非常感谢!
0赞 12/14/2017
@ArnaudDenoyelle 谢谢你的链接。现在我只需要找出阵列问题在哪里......

答:

1赞 Eran 12/14/2017 #1

setOBJ(Object obj)将 an 的引用指定给 。它不会创建新实例。Objectthis.obj

另一方面,每次创建 的新实例时,也会创建一个新实例并将其分配给 (作为 的结果)。TestObjectobjObject obj = new Object();

问题是你调用了多少次,以及是否每次都传递一个新实例。我们无法通过您发布的代码来判断。setOBJObject

评论

0赞 12/14/2017
哦不,那没关系。我知道我到处都有数组问题,但我只是想把它们挑出来。如果它只是通过引用,那么我想我找错了地方。非常感谢!:)
0赞 12/14/2017
请问,getter 也是按值传递的吗?
1赞 Eran 12/14/2017
@finnrayment 您是否在询问 getter 是否在每次调用时都创建新实例?通常不会,除非它包含创建您尝试获取的实例的新副本的代码,并返回对该副本的引用。
0赞 12/14/2017
是的,这回答了这个问题!非常感谢你,Eran。