如何在java中通过引用传递值

时间:2016-10-10 17:26:36

标签: java function parameter-passing

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);
    }

}

4 个答案:

答案 0 :(得分:3)

虽然使用int(整数的基本类型)无法实现这一点,但您可以使用AtomicInteger完成非常类似的操作。只需在类的实例上调用getAndIncrement方法即可。像这样:

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

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

答案 1 :(得分:3)

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

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

在一天结束时,使用上述内容需要程序员的参数。

答案 2 :(得分:1)

对于像int这样的基本类型,你不能这样做,因为Java会按值传递基元。只需将b包装在一个可变容器对象中:

class Holder {
  int b;
}

现在您可以通过执行以下操作来修改该值:

public static void a(Holder h) {
  h.b++;
}
但是,您应该考虑使用Immutable Objects,这通常被认为是Java中的好东西,可以避免副作用和并发问题。

答案 3 :(得分:0)

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