Java 我们应该在什么时候修改通过引用传递的对象?

Java 我们应该在什么时候修改通过引用传递的对象?,java,pass-by-reference,Java,Pass By Reference,在查看一些java代码时,我遇到了如下代码: Integer initialQ = someObject.getInitialQ(); Integer finalQ = null; BigDecimal factor = calculateFactor(initialQ, finalQ); if (finalQ.compareTo(initialQ) != 0){ //do something } finalQ在方法calculateFactor中修改 Eclipse在if(final

在查看一些java代码时,我遇到了如下代码:

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

if (finalQ.compareTo(initialQ) != 0){
   //do something
}
finalQ
在方法calculateFactor中修改

Eclipse在
if(finalQ…
上给了我一个“Null指针访问:变量idunidadfail只能在此位置为Null”的警告。我理解,由于我们需要从该方法返回
因子
,因此修改
finalQ
的唯一方法是将其作为引用传递。但是,这是正确的、公认的做法吗


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

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

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

在java中没有称为按引用传递的东西,这是一个令人困惑的术语

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

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


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

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

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

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


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

finalQ
是一个按值传递到
calculateFactor
的引用,它不是一个引用,而是一个传递的对象。在函数
calculateFactor()
中创建了一个类型为
Integer
的新对象。@Aashray不是真的。复制的是引用,而不是对象。@Aashray对了,我忘了Java中没有任何东西是通过引用传递的。检查此项。
finalQ
是一个通过值传递到
calculateFactor
的引用,它不是引用,而是传递的对象。在函数
calculateFactor()
中创建了一个类型为
Integer
的新对象。@Aashray不是真的。复制的是引用,而不是对象。@Aashray对了,我忘了Java中没有任何东西是通过引用传递的。看看这个。