【问题标题】:Passing by reference into a setter通过引用传递给 setter
【发布时间】:2018-05-28 09:31:51
【问题描述】:

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

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

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

它是将this.obj 设置为obj 的新实例,还是对obj 的引用?

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

最后,在多线程中,有什么变化吗,还是会以同样的方式传递?老实说只是好奇。

【问题讨论】:

  • "它是否将this.obj 设置为obj 的新实例,还是对obj 的引用?" -> 它返回对对象的引用,而不是克隆。 “此外,它是否在每种情况下都这样做”->是的,您总是通过引用。 “最后,在多线程中,有什么改变,还是会以同样的方式传递?” -> 是的,即使在多线程环境中,引用也会传递给方法。
  • 看看this link TL;DR:你只复制这个对象的引用,你不克隆它。由于另一个原因,您的程序运行缓慢。
  • @Turing85 非常感谢!
  • @ArnaudDenoyelle 感谢您的链接。现在我只需要找出数组问题在哪里...

标签: java object pass-by-reference pass-by-value


【解决方案1】:

setOBJ(Object obj) 将Object 的引用分配给this.obj。它不会创建新实例。

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

问题是您调用setOBJ 的次数,以及每次是否向它传递一个新的Object 实例。我们无法通过您发布的代码来判断。

【讨论】:

  • 哦不,那很好。我知道我到处都有数组问题,但我只是想把它们挑出来。如果它只是通过引用,那么我想我找错地方了。非常感谢! :)
  • 请问,getter 也是按值传递的吗?
  • @finnrayment 您是否在询问 getter 是否在每次调用时都在创建一个新实例?通常它不会,除非它包含创建您尝试获取的实例的新副本并返回对该副本的引用的代码。
  • 是的,这回答了问题!非常感谢 Eran。
猜你喜欢
  • 2020-05-03
  • 2016-12-18
  • 1970-01-01
  • 2023-03-08
  • 2017-08-12
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
相关资源
最近更新 更多