首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java中通过引用传递值

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

Stack Overflow用户
提问于 2016-10-11 01:26:36
回答 4查看 125关注 0票数 6
代码语言:javascript
复制
public class JavaApplication6 {

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

我调用函数a并传递变量b,目的是像C++引用(&b)一样递增它。这样行得通吗?若否,原因为何?

代码语言:javascript
复制
    public static void main(String[] args) {

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

}
EN

回答 4

Stack Overflow用户

发布于 2016-10-11 01:41:46

虽然用int (整数的原语类型)不能真正做到这一点,但可以用AtomicInteger完成一些非常类似的事情。只需在类的实例上调用getAndIncrement方法即可。如下所示:

代码语言:javascript
复制
public static void a(AtomicInteger b) {
    b.getAndIncrement();
}

(请注意,使用java.lang.Integer也不能做到这一点,因为java.lang.Integer是一个不可变的类。)

票数 3
EN

Stack Overflow用户

发布于 2016-10-11 01:57:43

首先: Java不允许按引用传递。此外,不使用输出参数(当函数的计算/结果放在传递给它的一个或多个变量中时);取而代之的是,从如下方法中return出一些东西:

代码语言:javascript
复制
b = a(b);

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

代码语言:javascript
复制
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++;
}

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

代码语言:javascript
复制
3

归根结底,使用上面的方法需要程序员使用参数。

票数 3
EN

Stack Overflow用户

发布于 2016-10-11 02:06:35

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

代码语言:javascript
复制
class Holder {
  int b;
}

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

代码语言:javascript
复制
public static void a(Holder h) {
  h.b++;
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39963625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档