【问题标题】:How to pass the value by reference in java如何在java中通过引用传递值
【发布时间】:2017-02-19 04:34:55
【问题描述】:
public class JavaApplication6 {

    public static void a(int b)
    {
        b++;
    }

我正在调用函数 a 并传递变量 b,目的是像 C++ 引用 (&b) 一样递增它。这行得通吗?如果不是,为什么?

    public static void main(String[] args) {

        int b=0;
        a(b);
        System.out.println(b);
    }

}

【问题讨论】:

  • 你不能那样做。
  • 但是为什么我可以在 c++ 中通过引用将变量传递给函数来做到这一点除了全局声明之外还有其他方法吗
  • 在 Java 中它是按值传递的,因此您不能更改 b 的值。而在 C、C++ 等编程语言中,您可以传递指针并使用指针来增加值。
  • 这通常是一个坏主意,并导致复杂的不可读代码。你想解决什么问题?
  • 您不能“本机”执行此操作,但您可以使用可以修改的成员变量 int b 的单个引用来定义自己的 MyInt

标签: java function parameter-passing


【解决方案1】:

虽然使用int(整数的原始类型)无法真正实现这一点,但使用AtomicInteger 可以实现非常相似的功能。只需在类的实例上调用getAndIncrement 方法。像这样的:

public static void a(AtomicInteger b) {
    b.getAndIncrement();
}

(请注意,您也不能对 java.lang.Integer 执行此操作,因为 java.lang.Integer 是一个不可变类。)

【讨论】:

  • 您可以对任何带有AtomicReference 的数据类型执行此操作。不过,它与惯用的 Java 相去甚远,而且通常不鼓励使用。
  • 虽然这完成了任务,但使用AtomicInteger 只是为了使用它的可变属性可能不是最好的主意,因为非阻塞同步开销。
【解决方案2】:

首先:Java 不允许传递引用。此外,out-parameters(当一个函数的计算/结果被放置在一个或多个传递给它的变量中时)没有被使用;相反,returned 来自类似这样的方法:

b = a(b);

否则,在 Java 中,您将对象作为指针传递 (which are incorrectly called references)。不幸的是(在您的情况下)与intIntegerBigInteger 等)对应的大多数类型都是不可变的,因此您无法在不创建新属性的情况下更改对象中的属性。但是,您可以自己实现:

public static class MutableInteger {
    public int value;

    public MutableInteger(int value) {
        this.value = value;
    }
}

public static void main(String[] args) {
    MutableInteger b = new MutableInteger(2);
    increment(b);
    System.out.println(b.value);
}

public static void increment(MutableInteger mutableInteger) {
    mutableInteger.value++;
}

运行此代码时,控制台将打印以下内容:

3

归根结底,使用上述方法需要程序员提供 strong 参数。

【讨论】:

    【解决方案3】:

    对于像 int 这样的原始类型,您无法做到这一点,因为 Java 通过值传递原始类型。只需将 b 包装在可变容器对象中即可:

    class Holder {
      int b;
    }
    

    现在您可以通过以下方式修改值:

    public static void a(Holder h) {
      h.b++;
    }
    

    但是,您应该考虑使用 Immutable Objects,这在 Java 中通常被认为是一件好事,可以避免副作用和并发问题。

    【讨论】:

    • h.b = h.b++; 认真的吗?
    • 否;它什么也不做。后缀自增运算符返回原始值。
    • 上升。已更正。
    • 但为什么不只是h.b++;
    【解决方案4】:

    您不能在 Java 中通过引用传递值。如果将原语传递给方法,则 JVM 按值传递它。如果它是发送到方法的对象,JVM 会创建其引用的副本。由于这是一个“副本”,因此修改不会更改初始对象。但是,仍然有一些解决方法,例如使用之前帖子中建议的 AtomicInteger。

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多