0

我正在使用一些 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);
}

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

问候

4

3 回答 3

0

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

于 2013-09-20T06:48:59.280 回答
0

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

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

于 2013-09-20T06:56:06.083 回答
0

是的,如果该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" );
}

干杯,

于 2013-09-20T07:06:17.230 回答