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

6
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
你不能那样做。 - SLaks
1
但是为什么我可以通过将变量作为引用传递给函数在C++中实现它,除了全局声明还有其他方法吗? - striker
2
在Java中,它是按值传递的,因此您无法更改b的值。而在像C、C++这样的编程语言中,您可以传递指针并使用指针来增加值。 - SMA
2
这通常不是一个好主意,会导致复杂难懂的代码。你想解决什么问题呢? - SLaks
2
你不能“本地”地做到这一点,但是你可以定义自己的MyInt类,其中包含一个单独的成员变量int b的引用,你可以修改它。 - OneCricketeer
显示剩余7条评论
4个回答

3

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

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

(请注意,您也不能使用java.lang.Integer来实现此操作,因为java.lang.Integer是一个不可变的类。)

1
你可以使用AtomicReference来处理任何数据类型。但这并不是Java的惯用写法,一般不建议使用。 - Andrew Rueckert
1
虽然这可以完成任务,但仅仅为了使用其可变属性而使用AtomicInteger可能不是最佳选择,因为会带来非阻塞同步开销。 - Patrick

3
首先:Java不允许传递引用。此外,不使用“输出参数”(当函数的计算/结果放置在传递给它的一个或多个变量中时),而是从方法中返回某些内容,如下所示:
b = a(b);

否则,在Java中,您将对象作为指针传递(不正确地称为引用)。不幸的是(在您的情况下),大多数对应于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

说到底,使用以上内容需要程序员提供有力的论据。


1

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

class Holder {
  int b;
}

现在您可以通过以下方式修改该值:
public static void a(Holder h) {
  h.b++;
}

然而,你应该考虑使用不可变对象,在Java中通常被认为是避免副作用和并发问题的好方法。


h.b = h.b++; 真的吗? - Patrick
不会的,它什么也不做。后缀递增运算符返回原始值。 - SLaks
抱歉,已经更正。 - Stefan Haberl
但是为什么不直接使用 h.b++; 呢? - Spotted

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接