【问题标题】:Modifying object collections修改对象集合
【发布时间】:2013-09-20 06:47:25
【问题描述】:

我正在编写一些 Java 代码,但我有疑问。我有一个循环,沿着 Collection 使用方法修改它的每个对象。问题是,当您将对象传递给方法时,您真正传递的是什么?参考副本?内存地址?这是我的代码:

for(Iterator it = colDesglosesBDI.iterator(); it.hasNext();)
{    
    DesgloseBDIVO desgloseBDI = (DesgloseBDIVO)it.next();
    desgloseBDI = completeDesgloseAgrup(desgloseBDI);
}

方法 completeDesgloseAgrup 返回一个 DesgloseBDIVO 对象,因此我可以用新属性替换旧对象。但也许我可以这样做:

for(Iterator it = colDesglosesBDI.iterator(); it.hasNext();)
{    
    DesgloseBDIVO desgloseBDI = (DesgloseBDIVO)it.next();
    completeDesgloseAgrup(desgloseBDI);
}

在这种情况下,该方法将是无效的并且不返回任何对象。可以这样吗?

问候

【问题讨论】:

  • 我会说这取决于completeDesgloseAgrup 方法的作用。可以发一下代码吗?

标签: java call-by-value


【解决方案1】:

是的,如果completeDesgloseAgrup() 方法只更改参数的属性,而不尝试用新对象替换它,这是完全可能的。

考虑一下:

public void completeDesgloseAgrup( DesgloseBDIVO d )
{
    // will work, callee will see "something"
    d.setSomething( "something" );
}

public void completeDesgloseAgrup( DesgloseBDIVO d )
{
    // Won't work, as Java has call by value semantics. Callee won't see the new DesgloseBDIVO in callee's scope.
    d = new DesgloseBDIVO()
    d.setSomething( "something" );
}

干杯,

【讨论】:

    【解决方案2】:

    在 java 中,对象是堆上的数据结构,您可以通过变量引用这些数据结构,因此您永远不会传递对象,始终是对对象的引用。

    【讨论】:

      【解决方案3】:

      摘自 Ken Arnold、James Gosling 和 David Holmes 的“Java 编程语言,第 4 版”:

      Java 编程语言不通过引用传递对象;它passes object references by value。因为同一个引用的两个副本引用同一个实际对象,所以通过一个引用变量所做的更改通过另一个引用变量是可见的。传参方式只有一种 价值,这有助于让事情变得简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2015-05-03
        • 1970-01-01
        相关资源
        最近更新 更多