0

在查看一些 java 代码时,我遇到了这样一段代码:

Integer initialQ = someObject.getInitialQ();
Integer finalQ = null;
BigDecimal factor = calculateFactor(initialQ, finalQ);

if (finalQ.compareTo(initialQ) != 0){
   //do something
}

finalQ在方法 calculateFactor 中进行了修改。

Eclipse 给我一个“空指针访问:变量 idUnidadFinal 在这个位置只能为空”警告if (finalQ...)。我明白,由于我们需要factor从方法中返回,唯一的修改方法finalQ是将它作为参考传递。但是,这是正确的、被接受的方式吗?

我能想到的唯一选择是设计一个新的类,它具有finalQfactor作为字段,但看起来不必要地复杂。

4

2 回答 2

4

这不是通过引用传递。在传递给它的函数中创建了一个新对象。的值finalQ只能为空。如果要更改值或使其成为finalQ全局对象,则需要返回该对象。

于 2013-02-28T10:15:57.330 回答
2

java中没有所谓的通过引用传递,这是一个令人困惑的术语。

当你将一个对象传递给另一个函数时,传递的是引用的值。在该方法中,创建引用的本地副本并指向相同的内存地址。所以通常如果你传递一个非空变量并在一个单独的方法中修改它,原始对象也会改变,因为原始对象和方法本地副本指向相同的内存地址,但是如果你分配一个新实例到方法本地复制然后随后更改为本地副本与原始副本无关。

在您的情况下,我猜您在calculateFactor中为finalQ分配了一个非空实例,这使得finalQ 的本地副本指向另一个内存地址并保留原始 finalQ

因此,如果要修改传递给方法的对象,则只能更改它本身,而不能将其分配给另一个引用。如果最初传入的对象为 null 并且您期望对原始对象进行更改,则必须返回更改后的对象。

于 2013-02-28T10:24:49.097 回答