【问题标题】:When should we modify an object passed by reference?我们什么时候应该修改通过引用传递的对象?
【发布时间】:2013-02-28 10:13:05
【问题描述】:

在查看一些 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...) 上给了我一个“空指针访问:变量 idUnidadFinal 在这个位置只能为空”警告。我明白,既然我们需要从方法中返回factor,那么修改finalQ 的唯一方法就是将它作为引用传递。但是,这是正确的、被接受的方式吗?

我能想到的唯一替代方法是设计一个新类,其中包含 finalQfactor 作为字段,但看起来过于复杂。

【问题讨论】:

    标签: java pass-by-reference


    【解决方案1】:

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

    【讨论】:

    • finalQ 是通过值传递给calculateFactor的引用
    • 它不是一个引用,它是一个传递的对象。在函数calculateFactor() 中创建了一个Integer 类型的新对象。
    • @Aashray 不是。复制的是引用,而不是对象。
    • @Aashray 对,我忘了在 Java 中没有任何东西是通过引用传递的。
    【解决方案2】:

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

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

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

    所以如果你想修改传递给方法的对象,你只能改变它自己,但不能用另一个引用分配它。如果最初传入的对象为 null 并且您期望对原始对象进行更改,则必须返回更改后的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2021-09-07
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2016-11-11
      相关资源
      最近更新 更多