我正在使用一些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);
}
在这种情况下,该方法将无效,并且不返回任何对象。可以这样做吗?
此致
答案 0 :(得分:0)
在java对象中,堆是由变量引用的数据结构,因此你永远不会传递对象,总是对对象的引用。
答案 1 :(得分:0)
来自Ken Arnold,James Gosling和David Holmes的“Java编程语言,第4版”:
Java编程语言不通过引用传递对象;它
passes object references by value
。因为同一引用的两个副本引用相同的实际对象,所以通过一个引用变量所做的更改可以通过另一个引用变量看到。只有一个参数传递模式通过 价值,这有助于保持简单。
答案 2 :(得分: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" );
}
干杯,